我正在尝试用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]+))?))?)?)?((?:\/?(?:[^\/\?#]+\/+)*)(?:[^\?#]*)))?(\?[^#]+)?)(#.*)?
此正则表达式的功劳归https://gist.github.com/rpflorence谁发布了这个jsperf http://jsperf.com/url-parsing(最初在这里找到:https://gist.github.com/jlong/2428561 #comment-310066)谁提出了这个正则表达式的正则表达式。
零件按此顺序排列:
var keys = [
"href", // http://user:pass@host.com:81/directory/file.ext?query=1#anchor
"origin", // http://user:pass@host.com:81
"protocol", // http:
"username", // user
"password", // pass
"host", // host.com:81
"hostname", // host.com
"port", // 81
"pathname", // /directory/file.ext
"search", // ?query=1
"hash" // #anchor
];
还有一个小的库可以包装它并提供查询参数:
https://github.com/sadams/lite-url(也可以在凉亭上找到)
如果您有改进,请创建一个包含更多测试的请求请求,我将接受并合并表示感谢。
CrackUrl
。如果存在这样的功能,请使用它,几乎可以保证它比任何手工编写的代码都更加可靠和高效。