ฉันพยายามแก้ปัญหานี้ใน javascript ซึ่งควรจัดการโดย:
var url = new URL('http://a:b@example.com:890/path/wah@t/foo.js?foo=bar&bingobang=&king=kong@kong.com#foobar/bing/bo@ng?bang')
เนื่องจาก (อย่างน้อยใน Chrome) จะแยกวิเคราะห์เป็น:
{
"hash": "#foobar/bing/bo@ng?bang",
"search": "?foo=bar&bingobang=&king=kong@kong.com",
"pathname": "/path/wah@t/foo.js",
"port": "890",
"hostname": "example.com",
"host": "example.com:890",
"password": "b",
"username": "a",
"protocol": "http:",
"origin": "http://example.com:890",
"href": "http://a:b@example.com:890/path/wah@t/foo.js?foo=bar&bingobang=&king=kong@kong.com#foobar/bing/bo@ng?bang"
}
อย่างไรก็ตามนี่ไม่ใช่เบราว์เซอร์ข้าม ( https://developer.mozilla.org/en-US/docs/Web/API/URL ) ดังนั้นฉันจึงปูสิ่งนี้เข้าด้วยกันเพื่อดึงส่วนเดียวกันออกมาข้างต้น:
^(?:(?:(([^:\/#\?]+:)?(?:(?:\/\/)(?:(?:(?:([^:@\/#\?]+)(?:\:([^:@\/#\?]*))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((?:\/?(?:[^\/\?#]+\/+)*)(?:[^\?#]*)))?(\?[^#]+)?)(#.*)?
เครดิตสำหรับ regex นี้ไปที่https://gist.github.com/rpflorenceผู้โพสต์ jsperf นี้http://jsperf.com/url-parsing (พบที่นี่: https://gist.github.com/jlong/2428561 # comment-310066 ) ผู้ที่สร้าง regex ซึ่งเดิมขึ้นอยู่กับ.
ชิ้นส่วนอยู่ในลำดับนี้:
var keys = [
"href",
"origin",
"protocol",
"username",
"password",
"host",
"hostname",
"port",
"pathname",
"search",
"hash"
];
นอกจากนี้ยังมีไลบรารีขนาดเล็กที่ล้อมรอบและมีพารามิเตอร์แบบสอบถาม:
https://github.com/sadams/lite-url (มีให้บริการใน bower)
หากคุณมีการปรับปรุงโปรดสร้างคำขอดึงพร้อมการทดสอบเพิ่มเติมและฉันจะยอมรับและรวมเข้าด้วยขอบคุณ
CrackUrl
. หากมีฟังก์ชั่นดังกล่าวให้ใช้มันเกือบจะรับประกันได้ว่าน่าเชื่อถือและมีประสิทธิภาพมากกว่าโค้ดที่สร้างขึ้นด้วยมือใด ๆ