Я пытался решить эту проблему в 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 (также доступно на беседке)
Если у вас есть улучшения, пожалуйста, создайте запрос на получение дополнительных тестов, и я с благодарностью приму и объединю.