UrlParser เป็นไลบรารี PHP ที่ให้ตัวแยกวิเคราะห์ URL ที่สอดคล้องกับ RFC 3986 และส่วนประกอบ URI ที่เข้ากันได้กับ PSR-7 วัตถุประสงค์ของไลบรารีนี้คือเพื่อให้ parser ที่ใช้ข้อกำหนด RFC ได้อย่างถูกต้อง ซึ่งแตกต่างจากฟังก์ชัน parse_url()
ที่มีอยู่ในตัว ซึ่งแตกต่างจากข้อกำหนดในลักษณะที่ละเอียดอ่อนบางอย่าง
ห้องสมุดนี้มีจุดประสงค์หลักสองประการ คนแรกที่ให้ข้อมูลจาก URL ที่แยกวิเคราะห์ เพื่อให้บรรลุเป้าหมายนี้ ไลบรารีจึงใช้อินเทอร์เฟซการจัดการ URI มาตรฐานจาก PSR-7 และยังมีวิธีการเพิ่มเติมที่ทำให้เรียกข้อมูลที่ใช้โดยทั่วไปจาก URL ได้ง่ายขึ้น วัตถุประสงค์ที่สองคือการอนุญาตให้แก้ไข URL ดังกล่าวโดยใช้อินเทอร์เฟซจากมาตรฐาน PSR-7 นอกเหนือจากวิธีการพิเศษบางอย่างที่ทำให้งานบางอย่างตรงไปตรงมามากขึ้น
แม้ว่าไลบรารีนี้มีไว้สำหรับการแยกวิเคราะห์ URL เป็นหลัก แต่การแยกวิเคราะห์จะขึ้นอยู่กับไวยากรณ์ URI ทั่วไป ดังนั้นจึงเป็นไปได้ที่จะใช้ไลบรารีนี้เพื่อตรวจสอบและแยกวิเคราะห์ URI ประเภทอื่นโดยเทียบกับไวยากรณ์ทั่วไป ไลบรารีไม่ได้ทำการตรวจสอบเฉพาะโครงการสำหรับ URL
นอกเหนือจากโหมดมาตรฐาน RFC 3986 แล้ว ไลบรารียังมีตัวเลือกที่อนุญาตให้แยกวิเคราะห์ URL ที่มีอักขระ UTF-8 ในส่วนประกอบต่างๆ ของ URL ในขณะที่แปลงเป็นรูปแบบเปอร์เซ็นต์ที่เข้ารหัสและ IDN ASCII ที่เหมาะสม
เอกสารประกอบ API มีอยู่ที่: http://kit.riimu.net/api/urlparser/
^1.0
)intl
(รองรับ IDN เท่านั้น) วิธีที่ง่ายที่สุดในการติดตั้งไลบรารีนี้คือการใช้ Composer เพื่อจัดการการขึ้นต่อกันของคุณ ในการติดตั้งไลบรารีนี้ผ่าน Composer เพียงปฏิบัติตามสองขั้นตอนเหล่านี้:
รับ composer.phar
โดยการรันการติดตั้งบรรทัดคำสั่ง Composer ในรูทโปรเจ็กต์ของคุณ
เมื่อคุณรันสคริปต์การติดตั้งแล้ว คุณควรมีไฟล์ composer.phar
ในโปรเจ็กต์รูทของคุณ และคุณสามารถรันคำสั่งต่อไปนี้:
php composer.phar require "riimu/kit-urlparser:^2.1"
หลังจากติดตั้งไลบรารีนี้ผ่าน Composer คุณสามารถโหลดไลบรารีโดยรวมไฟล์ vendor/autoload.php
ที่สร้างโดย Composer ระหว่างการติดตั้ง
หากคุณคุ้นเคยกับวิธีใช้ Composer อยู่แล้ว คุณสามารถเพิ่มไลบรารีเป็นการพึ่งพาได้โดยการเพิ่มไฟล์ composer.json
ต่อไปนี้ในโปรเจ็กต์ของคุณ และรันคำสั่ง composer install
:
{
"require" : {
"riimu/kit-urlparser" : " ^2.1 "
}
}
หากคุณไม่ต้องการใช้ Composer เพื่อโหลดไลบรารี คุณสามารถดาวน์โหลดไลบรารีได้ด้วยตนเองโดยการดาวน์โหลดรุ่นล่าสุดและแยกโฟลเดอร์ src
ไปยังโปรเจ็กต์ของคุณ จากนั้นคุณอาจรวมไฟล์ src/autoload.php
ที่ให้มาเพื่อโหลดคลาสไลบรารี
โปรดทราบว่าการใช้ Composer จะดาวน์โหลดไลบรารี PHP ที่จำเป็นอื่นๆ โดยอัตโนมัติด้วย หากคุณติดตั้งไลบรารีนี้ด้วยตนเอง คุณจะต้องทำให้ไลบรารีที่จำเป็นอื่นๆ เหล่านั้นพร้อมใช้งานด้วย
การใช้ไลบรารีนี้ค่อนข้างตรงไปตรงมา ไลบรารีจัดเตรียมคลาสการแยกวิเคราะห์ URL UriParser
และคลาสอ็อบเจ็กต์ค่าที่ไม่เปลี่ยนรูป Uri
ที่แสดงถึง URL หากต้องการแยกวิเคราะห์ URL คุณสามารถระบุ URL เป็นสตริงให้กับวิธี parse()
ใน UriParser
ซึ่งส่งคืนอินสแตนซ์ของ Uri
ที่สร้างขึ้นจาก URL ที่แยกวิเคราะห์
ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
$ parser = new Riimu Kit UrlParser UriParser ();
$ uri = $ parser -> parse ( ' http://www.example.com ' );
echo $ uri -> getHost (); // Outputs 'www.example.com'
หรือคุณสามารถข้ามการใช้ UriParser
ไปเลยและเพียงระบุ URL เป็นพารามิเตอร์ตัวสร้างให้กับ Uri
:
<?php
require ' vendor/autoload.php ' ;
$ uri = new Riimu Kit UrlParser Uri ( ' http://www.example.com ' );
echo $ uri -> getHost (); // Outputs 'www.example.com'
ข้อแตกต่างที่สำคัญระหว่างการใช้เมธอด parse()
และคอนสตรัคเตอร์คือ เมธอด parse()
จะส่งคืน null
หาก URL ที่ระบุไม่ใช่ URL ที่ถูกต้อง ในขณะที่คอนสตรัคเตอร์จะส่ง InvalidArgumentException
ในการดึงข้อมูลประเภทต่างๆ จาก URL คลาส Uri
มีวิธีการต่างๆ มากมายเพื่อช่วยเหลือคุณ นี่เป็นตัวอย่างง่ายๆ ที่เป็นภาพรวมของวิธีการต่างๆ ที่มี:
<?php
require ' vendor/autoload.php ' ;
$ parser = new Riimu Kit UrlParser UriParser ();
$ uri = $ parser -> parse ( ' http://jane:[email protected]:8080/site/index.php?action=login&prev=index#form ' );
echo $ uri -> getScheme () . PHP_EOL ; // outputs: http
echo $ uri -> getUsername () . PHP_EOL ; // outputs: jane
echo $ uri -> getPassword () . PHP_EOL ; // outputs: pass123
echo $ uri -> getHost () . PHP_EOL ; // outputs: www.example.com
echo $ uri -> getTopLevelDomain () . PHP_EOL ; // outputs: com
echo $ uri -> getPort () . PHP_EOL ; // outputs: 8080
echo $ uri -> getStandardPort () . PHP_EOL ; // outputs: 80
echo $ uri -> getPath () . PHP_EOL ; // outputs: /site/index.php
echo $ uri -> getPathExtension () . PHP_EOL ; // outputs: php
echo $ uri -> getQuery () . PHP_EOL ; // outputs: action=login&prev=index
echo $ uri -> getFragment () . PHP_EOL ; // outputs: form
print_r ( $ uri -> getPathSegments ()); // [0 => 'site', 1 => 'index.php']
print_r ( $ uri -> getQueryParameters ()); // ['action' => 'login', 'prev' => 'index']
คอมโพเนนต์ Uri
ยังมีวิธีการต่างๆ ในการแก้ไข URL ซึ่งช่วยให้คุณสามารถสร้าง URL ใหม่จากคอมโพเนนต์ที่แยกจากกันหรือแก้ไขที่มีอยู่ได้ โปรดทราบว่าองค์ประกอบ Uri
เป็นออบเจ็กต์ค่าที่ไม่เปลี่ยนรูป ซึ่งหมายความว่าแต่ละวิธีการแก้ไขจะส่งคืนอินสแตนซ์ Uri
ใหม่แทนที่จะแก้ไขวิธีที่มีอยู่ นี่คือตัวอย่างง่ายๆ ของการสร้าง URL จากส่วนประกอบ:
<?php
require ' vendor/autoload.php ' ;
$ uri = ( new Riimu Kit UrlParser Uri ())
-> withScheme ( ' http ' )
-> withUserInfo ( ' jane ' , ' pass123 ' )
-> withHost ( ' www.example.com ' )
-> withPort ( 8080 )
-> withPath ( ' /site/index.php ' )
-> withQueryParameters ([ ' action ' => ' login ' , ' prev ' => ' index ' ])
-> withFragment ( ' form ' );
// Outputs: http://jane:[email protected]:8080/site/index.php?action=login&prev=index#form
echo $ uri ;
ดังที่เห็นได้จากตัวอย่างก่อนหน้านี้ คอมโพเนนต์ Uri
ยังมีเมธอด __toString()
ที่ให้ URL เป็นสตริง
นี่คือรายการวิธีการที่คอมโพเนนต์ Uri
จัดเตรียมไว้สำหรับการดึงข้อมูลจาก URL:
getScheme()
ส่งคืนโครงร่างจาก URL หรือสตริงว่างหาก URL ไม่มีโครงร่าง
getAuthority()
ส่งคืนส่วนประกอบจาก URL ที่ประกอบด้วยชื่อผู้ใช้ รหัสผ่าน ชื่อโฮสต์ และพอร์ตในรูปแบบ user-info@hostname:port
getUserInfo()
ส่งคืนส่วนประกอบจาก URL ที่มีชื่อผู้ใช้และรหัสผ่านคั่นด้วยเครื่องหมายทวิภาค
getUsername()
ส่งคืนชื่อผู้ใช้ ที่ถอดรหัส จาก URL หรือสตริงว่างหากไม่มีชื่อผู้ใช้อยู่ใน URL
getPassword()
ส่งคืนรหัสผ่าน ที่ถอดรหัส จาก URL หรือสตริงว่างหากไม่มีรหัสผ่านอยู่ใน URL
getHost()
ส่งคืนชื่อโฮสต์จาก URL หรือสตริงว่างหาก URL ไม่มีโฮสต์
getIpAddress()
ส่งคืนที่อยู่ IP จากโฮสต์ หากโฮสต์เป็นที่อยู่ IP มิฉะนั้นวิธีนี้จะคืนค่า null
หากมีการระบุที่อยู่ IPv6 ที่อยู่จะถูกส่งกลับโดยไม่มีวงเล็บปีกกาล้อมรอบ
getTopLevelDomain()
ส่งคืนโดเมนระดับบนสุดจากโฮสต์ หากไม่มีโฮสต์หรือโฮสต์เป็นที่อยู่ IP สตริงว่างจะถูกส่งกลับแทน
getPort()
ส่งคืนพอร์ตจาก URL หรือเป็น null
หากไม่มีพอร์ตอยู่ใน url วิธีนี้จะส่งคืน null
หากพอร์ตนั้นเป็นพอร์ตมาตรฐานสำหรับโครงร่างปัจจุบัน (เช่น 80 สำหรับ http)
getStandardPort()
ส่งคืนพอร์ตมาตรฐานสำหรับโครงร่างปัจจุบัน หากไม่มีโครงร่างหรือไม่ทราบพอร์ตมาตรฐานสำหรับโครงร่าง ระบบจะส่งคืน null
แทน
getPath()
ส่งคืนเส้นทางจาก URL หรือสตริงว่างหาก URL ไม่มีเส้นทาง
getPathSegments()
ส่งคืนอาร์เรย์ของเซ็กเมนต์เส้นทาง ที่ถอดรหัส (เช่น เส้นทางที่แยกด้วยเครื่องหมายทับแต่ละอัน) ส่วนเส้นทางที่ว่างเปล่าจะถูกละทิ้งและไม่รวมอยู่ในอาร์เรย์ที่ส่งคืน
getPathExtension()
ส่งคืนนามสกุลไฟล์จากเส้นทางหรือสตริงว่างหาก URL ไม่มีเส้นทาง
getQuery()
ส่งคืนสตริงการสืบค้นจาก URL หรือสตริงว่างหาก URL นั้นไม่มีสตริงการสืบค้น
getQueryParameters()
แยกวิเคราะห์สตริงการสืบค้นจาก URL โดยใช้ฟังก์ชัน parse_str()
และส่งกลับอาร์เรย์ของค่าที่แยกวิเคราะห์
getFragment()
ส่งคืนแฟรกเมนต์จาก URL หรือสตริงว่างหาก URL ไม่มีแฟรกเมนต์
__toString()
ส่งคืน URL ในรูปแบบสตริง
คอมโพเนนต์ Uri
มีวิธีการต่างๆ ที่สามารถใช้เพื่อแก้ไข URL และสร้างใหม่ได้ โปรดทราบว่าเนื่องจากคลาส Uri
เป็นอ็อบเจ็กต์ค่าที่ไม่เปลี่ยนรูป แต่ละเมธอดจึงส่งคืนอินสแตนซ์ใหม่ของ Uri
แทนที่จะแก้ไขอันที่มีอยู่
withScheme($scheme)
ส่งคืนอินสแตนซ์ใหม่พร้อมกับโครงร่างที่กำหนด สามารถใช้โครงร่างเปล่าเพื่อลบโครงร่างออกจาก URL โปรดทราบว่ารูปแบบใดๆ ที่ให้ไว้จะถูกทำให้เป็นมาตรฐานเป็นตัวพิมพ์เล็ก
withUserInfo($user, $password = null)
ส่งคืนอินสแตนซ์ใหม่พร้อมชื่อผู้ใช้และรหัสผ่านที่กำหนด โปรดทราบว่ารหัสผ่านจะถูกละเว้นเว้นแต่จะระบุชื่อผู้ใช้ ชื่อผู้ใช้ที่ว่างเปล่าสามารถใช้เพื่อลบชื่อผู้ใช้และรหัสผ่านออกจาก URL อักขระใดๆ ที่ไม่สามารถแทรกใน URL ได้ด้วยตัวเองจะถูกเข้ารหัสเป็นเปอร์เซ็นต์
withHost($host)
ส่งคืนอินสแตนซ์ใหม่พร้อมกับโฮสต์ที่กำหนด โฮสต์ว่างสามารถใช้เพื่อลบโฮสต์ออกจาก URL โปรดทราบว่าวิธีนี้ไม่ยอมรับชื่อโดเมนสากล โปรดทราบว่าวิธีนี้จะทำให้โฮสต์เป็นปกติให้เป็นตัวพิมพ์เล็กด้วย
withPort($port)
ส่งคืนอินสแตนซ์ใหม่พร้อมกับพอร์ตที่กำหนด null
สามารถใช้เพื่อลบพอร์ตออกจาก URL
withPath($path)
ส่งคืนอินสแตนซ์ใหม่พร้อมกับเส้นทางที่กำหนด เส้นทางว่างสามารถใช้เพื่อลบเส้นทางออกจาก URL โปรดทราบว่าอักขระใดๆ ที่ไม่ใช่อักขระเส้นทางที่ถูกต้องจะถูกเข้ารหัสเป็นเปอร์เซ็นต์ใน URL อย่างไรก็ตาม อักขระที่เข้ารหัสเปอร์เซ็นต์ที่มีอยู่จะไม่ถูกเข้ารหัสซ้ำซ้อน
withPathSegments(array $segments)
ส่งคืนอินสแตนซ์ใหม่พร้อมเส้นทางที่สร้างจากอาร์เรย์ของเซ็กเมนต์เส้นทาง อักขระพาธที่ไม่ถูกต้องทั้งหมดในส่วนต่างๆ จะถูกเข้ารหัสเป็นเปอร์เซ็นต์ รวมถึงเครื่องหมายทับและอักขระที่เข้ารหัสเปอร์เซ็นต์ที่มีอยู่
withQuery($query)
ส่งคืนอินสแตนซ์ใหม่พร้อมกับสตริงการสืบค้นที่กำหนด สามารถใช้สตริงการสืบค้นว่างเพื่อลบเส้นทางออกจาก URL โปรดทราบว่าอักขระใดๆ ที่ไม่ใช่อักขระสตริงการสืบค้นที่ถูกต้องจะถูกเข้ารหัสเป็นเปอร์เซ็นต์ใน URL อย่างไรก็ตาม อักขระที่เข้ารหัสเปอร์เซ็นต์ที่มีอยู่จะไม่ถูกเข้ารหัสซ้ำซ้อน
withQueryParameters(array $parameters)
ส่งคืนอินสแตนซ์ใหม่ด้วยสตริงการสืบค้นที่สร้างจากพารามิเตอร์ที่ให้มาโดยใช้ฟังก์ชัน http_build_query()
อักขระสตริงข้อความค้นหาที่ไม่ถูกต้องทั้งหมดในพารามิเตอร์จะถูกเข้ารหัสเป็นเปอร์เซ็นต์ รวมถึงเครื่องหมายและ เครื่องหมายเท่ากับ และอักขระที่เข้ารหัสเปอร์เซ็นต์ที่มีอยู่
withFragment($fragment)
ส่งคืนอินสแตนซ์ใหม่พร้อมกับแฟรกเมนต์ที่กำหนด สามารถใช้สตริงว่างเพื่อลบส่วนออกจาก URL โปรดทราบว่าอักขระใดๆ ที่ไม่ใช่อักขระส่วนที่ถูกต้องจะถูกเข้ารหัสเป็นเปอร์เซ็นต์ใน URL อย่างไรก็ตาม อักขระที่เข้ารหัสเปอร์เซ็นต์ที่มีอยู่จะไม่ถูกเข้ารหัสซ้ำซ้อน
ตามค่าเริ่มต้น ไลบรารีนี้จะมี parser ที่เป็นไปตาม RFC 3986 ข้อกำหนด RFC ไม่อนุญาตให้ใช้อักขระ UTF-8 ในชื่อโดเมนหรือส่วนอื่นๆ ของ URL การแสดงที่ถูกต้องสำหรับสิ่งเหล่านี้ใน URL คือการใช้มาตรฐาน IDN สำหรับชื่อโดเมนและเปอร์เซ็นต์การเข้ารหัสอักขระ UTF-8 ในส่วนอื่นๆ
อย่างไรก็ตาม เพื่อช่วยคุณจัดการกับอักขระที่เข้ารหัส UTF-8 วิธีการต่างๆ ในคอมโพเนนต์ Uri
จะเข้ารหัสเปอร์เซ็นต์อักขระใดๆ ที่ไม่สามารถแทรกใน URL โดยอัตโนมัติ รวมถึงอักขระ UTF-8 ด้วย อย่างไรก็ตาม เนื่องจากความซับซ้อนที่เกี่ยวข้อง เมธอด withHost()
จึงไม่อนุญาตให้ใช้อักขระที่เข้ารหัส UTF-8
ตามค่าเริ่มต้น parser จะไม่แยกวิเคราะห์ URL ใดๆ ที่มีอักขระที่เข้ารหัส UTF-8 เนื่องจากจะขัดกับข้อกำหนด RFC อย่างไรก็ตาม parser มีโหมดการแยกวิเคราะห์เพิ่มเติมสองโหมดที่อนุญาตให้ใช้อักขระเหล่านี้ทุกครั้งที่เป็นไปได้
หากคุณต้องการแยกวิเคราะห์ URL ที่อาจมีอักขระ UTF-8 ในข้อมูลผู้ใช้ (เช่น ชื่อผู้ใช้หรือรหัสผ่าน) เส้นทาง ข้อความค้นหา หรือส่วนประกอบย่อยของ URL คุณสามารถใช้โหมดการแยกวิเคราะห์ UTF-8 ได้ ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
$ parser = new Riimu Kit UrlParser UriParser ();
$ parser -> setMode ( Riimu Kit UrlParser UriParser:: MODE_UTF8 );
$ uri = $ parser -> parse ( ' http://www.example.com/föö/bär.html ' );
echo $ uri -> getPath (); // Outputs: /f%C3%B6%C3%B6/b%C3%A4r.html
อย่างไรก็ตาม อักขระ UTF-8 ในชื่อโดเมนนั้นเป็นปัญหาที่ซับซ้อนกว่าเล็กน้อย อย่างไรก็ตาม parser จะให้การสนับสนุนเบื้องต้นสำหรับการแยกวิเคราะห์ชื่อโดเมนเหล่านี้โดยใช้โหมด IDNA ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
$ parser = new Riimu Kit UrlParser UriParser ();
$ parser -> setMode ( Riimu Kit UrlParser UriParser:: MODE_IDNA );
$ uri = $ parser -> parse ( ' http://www.fööbär.com ' );
echo $ uri -> getHost (); // Outputs: www.xn--fbr-rla2ga.com
โปรดทราบว่าการใช้โหมดแยกวิเคราะห์นี้จำเป็นต้องเปิดใช้งานส่วนขยาย PHP intl
โหมดการแยกวิเคราะห์ที่เหมาะสมยังสามารถจัดเตรียมให้กับตัวสร้างของส่วนประกอบ Uri
โดยใช้พารามิเตอร์ตัวสร้างที่สอง
แม้ว่าจะมีการรองรับการแยกวิเคราะห์อักขระ UTF-8 เหล่านี้ แต่ไลบรารีนี้ไม่มีวิธีการใดๆ สำหรับการดำเนินการย้อนกลับ เนื่องจากวัตถุประสงค์ของไลบรารีนี้คือเพื่อจัดการกับ URI ที่สอดคล้องกับ RFC 3986
เนื่องจากข้อกำหนด RFC 3986 กำหนด URL บางรายการให้เทียบเท่ากัน แม้ว่าจะมีความแตกต่างกันเล็กน้อย ไลบรารีนี้จึงทำให้ค่าที่ระบุเป็นมาตรฐานน้อยที่สุด คุณอาจพบกรณีเหล่านี้เมื่อ ตัวอย่างเช่น การแยกวิเคราะห์ URL ที่ผู้ใช้ให้มา การทำให้เป็นมาตรฐานที่โดดเด่นที่สุดที่คุณอาจพบมีดังนี้:
scheme
และ host
ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ดังนั้นส่วนประกอบเหล่านี้จะถูกทำให้เป็นมาตรฐานเป็นตัวพิมพ์เล็กเสมอgetAuthority()
และ __toString()
หากพอร์ตนั้นเป็นพอร์ตมาตรฐานสำหรับโครงร่างปัจจุบัน__toString()
อาจเปลี่ยนแปลงได้ ขึ้นอยู่กับว่า URL มีส่วนประกอบ authority
หรือไม่userinfo
อาจแตกต่างกันเนื่องจาก UriParser
ทำงานร่วมกับข้อกำหนด PSR-7 ซึ่งไม่มีวิธีการระบุชื่อผู้ใช้หรือรหัสผ่านที่เข้ารหัส ห้องสมุดนี้เป็นลิขสิทธิ์ (c) 2013-2022 Riikka Kalliomäki
ดูใบอนุญาตสำหรับข้อมูลใบอนุญาตและการคัดลอก