Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Получение частей a URL (Regex)
Учитывая URL (одна строка):
http://test.example.com/dir/subdir/file.html
Как извлечь следующие части с помощью регулярных выражений:
- Поддомен (тест)
- Домен (example.com)
- Путь без файла (/dir/subdir/)
- Файл (file.html)
- Путь к файлу (/dir/subdir/file.html)
- URL без пути ( http://test.example.com )
- (добавьте любое другое, что вы считаете полезным)
regex должен работать правильно, даже если я ввожу следующий URL:
http://example.example.com/example/example/example.html
Один regex для разбора и распада a
полный URL включая параметры запроса
и якоря например
https://www.google.com/dir/1/2/search.html?арг=0-a&arg1=1-b&arg3-c#hash
^((http[s]?|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(.*)?(#[\w\-]+)?$
RexEx позиций:
url: RegExp['$&'],
protocol:RegExp.$2,
host:RegExp.$3,
path:RegExp.$4,
file:RegExp.$6,
query:RegExp.$7,
hash:RegExp.$8
Один regex для разбора и распада a полный URL включая параметры запроса и якоря например
https://www.google.com/dir/1/2/search.html?арг=0-a&arg1=1-b&arg3-c#hash
^((http[s]?|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(.*)?(#[\w\-]+)?$
RexEx позиций:
url: RegExp['$&'],
protocol:RegExp.$2,
host:RegExp.$3,
path:RegExp.$4,
file:RegExp.$6,
query:RegExp.$7,
hash:RegExp.$8
затем можно было бы дополнительно разобрать хост ('.'delimited) довольно легко.
Что бы я сделал, так это использовал что-то вроде этого:
/*
^(.*:)//([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$
*/
proto $1
host $2
port $3
the-rest $4
дальнейший разбор 'the rest' должен быть максимально конкретным. Делать это в одном regex-это, ну, немного безумно.
Я понимаю, что опоздал на вечеринку, но есть простой способ позволить браузеру разобрать url для вас без regex:
var a = document.createElement('a');
a.href = 'http://www.example.com:123/foo/bar.html?fox=trot#foo';
['href','protocol','host','hostname','port','pathname','search','hash'].forEach(function(k) {
console.log(k+':', a[k]);
});
/*//Output:
href: http://www.example.com:123/foo/bar.html?fox=trot#foo
protocol: http:
host: www.example.com:123
hostname: www.example.com
port: 123
pathname: /foo/bar.html
search: ?fox=trot
hash: #foo
*/
Я на несколько лет опоздал на вечеринку, но я удивлен, что никто не упомянул, что в спецификации единого идентификатора ресурса есть раздел о разборе URIs с регулярным выражением . Регулярное выражение, написанное Бернерсом-Ли и др., есть:
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 12 3 4 5 6 7 8 9Цифры во второй строке выше приведены только для удобства чтения; они указывают опорные точки для каждого подвыражения (т. е. парные скобки). Мы ссылаемся на значение, сопоставленное для подвыражения как $. Например, сопоставление приведенного выше выражения с
http://www.ics.uci.edu/pub/ietf/uri/#Relatedрезультаты в следующих соответствиях подвыражений:
$1 = http: $2 = http $3 = //www.ics.uci.edu $4 = www.ics.uci.edu $5 = /pub/ietf/uri/ $6 = <undefined> $7 = <undefined> $8 = #Related $9 = Related
Как бы то ни было, я обнаружил, что мне пришлось избежать передних косых линий в JavaScript:
^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
Я обнаружил, что самый высокий голосованный Ответ (Ответ hometoast) не работает идеально для меня. Две проблемы:
- Он не может обрабатывать номер порта.
- Часть hash сломана.
Ниже приводится измененная версия:
^((http[s]?|ftp):\/)?\/?([^:\/\s]+)(:([^\/]*))?((\/\w+)*\/)([\w\-\.]+[^#?\s]+)(\?([^#]*))?(#(.*))?$
Положение деталей выглядит следующим образом:
int SCHEMA = 2, DOMAIN = 3, PORT = 5, PATH = 6, FILE = 8, QUERYSTRING = 9, HASH = 12
Редактировать сообщение, опубликованное пользователем anon:
function getFileName(path) {
return path.match(/^((http[s]?|ftp):\/)?\/?([^:\/\s]+)(:([^\/]*))?((\/[\w\/-]+)*\/)([\w\-\.]+[^#?\s]+)(\?([^#]*))?(#(.*))?$/i)[8];
}
Мне нужно было регулярное выражение, чтобы соответствовать всем URL-адресам, и я сделал это:
/(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*)\.(?=[^\.\/\:]*\.[^\.\/\:]*))?([^\.\/\:]*)(?:\.([^\/\.\:]*))?(?:\:([0-9]*))?(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))?/
Он соответствует всем URL-адресам, любому протоколу, даже таким, как
ftp://user:pass@www.cs.server.com:8080/dir1/dir2/file.php?param1=value1#hashtag
Результат (в JavaScript) выглядит так:
["ftp", "user", "pass", "www.cs", "server", "com", "8080", "/dir1/dir2/", "file.php", "param1=value1", "hashtag"]
В url как
mailto://admin@www.cs.server.com
выглядеть так:
["mailto", "admin", undefined, "www.cs", "server", "com", undefined, undefined, undefined, undefined, undefined]
Я пытался решить эту проблему в 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", // 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 (также доступно на bower)
Если у вас есть улучшение, пожалуйста, создайте запрос на вытягивание с большим количеством тестов, и я приму его и объединю с благодарностью.
Предложите гораздо более читабельное решение (в Python, но применимо к любому regex):
def url_path_to_dict(path):
pattern = (r'^'
r'((?P<schema>.+?)://)?'
r'((?P<user>.+?)(:(?P<password>.*?))?@)?'
r'(?P<host>.*?)'
r'(:(?P<port>\d+?))?'
r'(?P<path>/.*?)?'
r'(?P<query>[?].*?)?'
r'$'
)
regex = re.compile(pattern)
m = regex.match(path)
d = m.groupdict() if m is not None else None
return d
def main():
print url_path_to_dict('http://example.example.com/example/example/example.html')
Печать:
{
'host': 'example.example.com',
'user': None,
'path': '/example/example/example.html',
'query': None,
'password': None,
'port': None,
'schema': 'http'
}
Эта улучшенная версия должна работать так же надежно, как и парсер.
// Applies to URI, not just URL or URN:
// http://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Relationship_to_URL_and_URN
//
// http://labs.apache.org/webarch/uri/rfc/rfc3986.html#regexp
//
// (?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?
//
// http://en.wikipedia.org/wiki/URI_scheme#Generic_syntax
//
// $@ matches the entire uri
// $1 matches scheme (ftp, http, mailto, mshelp, ymsgr, etc)
// $2 matches authority (host, user:pwd@host, etc)
// $3 matches path
// $4 matches query (http GET REST api, etc)
// $5 matches fragment (html anchor, etc)
//
// Match specific schemes, non-optional authority, disallow white-space so can delimit in text, and allow 'www.' w/o scheme
// Note the schemes must match ^[^\s|:/?#]+(?:\|[^\s|:/?#]+)*$
//
// (?:()(www\.[^\s/?#]+\.[^\s/?#]+)|(schemes)://([^\s/?#]*))([^\s?#]*)(?:\?([^\s#]*))?(#(\S*))?
//
// Validate the authority with an orthogonal RegExp, so the RegExp above won’t fail to match any valid urls.
function uriRegExp( flags, schemes/* = null*/, noSubMatches/* = false*/ )
{
if( !schemes )
schemes = '[^\\s:\/?#]+'
else if( !RegExp( /^[^\s|:\/?#]+(?:\|[^\s|:\/?#]+)*$/ ).test( schemes ) )
throw TypeError( 'expected URI schemes' )
return noSubMatches ? new RegExp( '(?:www\\.[^\\s/?#]+\\.[^\\s/?#]+|' + schemes + '://[^\\s/?#]*)[^\\s?#]*(?:\\?[^\\s#]*)?(?:#\\S*)?', flags ) :
new RegExp( '(?:()(www\\.[^\\s/?#]+\\.[^\\s/?#]+)|(' + schemes + ')://([^\\s/?#]*))([^\\s?#]*)(?:\\?([^\\s#]*))?(?:#(\\S*))?', flags )
}
// http://en.wikipedia.org/wiki/URI_scheme#Official_IANA-registered_schemes
function uriSchemesRegExp()
{
return 'about|callto|ftp|gtalk|http|https|irc|ircs|javascript|mailto|mshelp|sftp|ssh|steam|tel|view-source|ymsgr'
}
Попробовать следующее:
^((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?
Он поддерживает HTTP / FTP, поддомены, папки, файлы и т.д.
Я нашел его из быстрого поиска в google:
http://geekswithblogs.net/casualjim/archive/2005/12/01/61722.aspx
субдомен и домен являются сложными, потому что субдомен может иметь несколько частей, как и домен верхнего уровня, http://sub1.sub2.domain.co.uk/
the path without the file : http://[^/]+/((?:[^/]+/)*(?:[^/]+$)?)
the file : http://[^/]+/(?:[^/]+/)*((?:[^/.]+\.)+[^/.]+)$
the path with the file : http://[^/]+/(.*)
the URL without the path : (http://[^/]+/)
(Markdown не очень дружелюбно относится к регексам)
/^((?P<scheme>https?|ftp):\/)?\/?((?P<username>.*?)(:(?P<password>.*?)|)@)?(?P<hostname>[^:\/\s]+)(?P<port>:([^\/]*))?(?P<path>(\/\w+)*\/)(?P<filename>[-\w.]+[^#?\s]*)?(?P<query>\?([^#]*))?(?P<fragment>#(.*))?$/
/^((?P<scheme>https?|ftp):\/)?\/?((?P<username>.*?)(:(?P<password>.*?)|)@)?(?P<hostname>[^:\/\s]+)(?P<port>:([^\/]*))?(?P<path>(\/\w+)*\/)(?P<filename>[-\w.]+[^#?\s]*)?(?P<query>\?([^#]*))?(?P<fragment>#(.*))?$/
Из моего ответа на аналогичный вопрос . Работает лучше, чем некоторые другие упомянутые, потому что у них были некоторые ошибки (например, не поддерживает username/password, не поддерживает односимвольные имена файлов, идентификаторы фрагментов ломаются).
Вы можете получить все хосты http/https,, порт, путь, а также запрос, используя объект Uri in .NET. просто сложная задача состоит в том, чтобы разбить Хост на поддомен, доменное имя и TLD.
Нет никакого стандарта, чтобы сделать это, и не может быть просто использовать синтаксический анализ строк или RegEx для получения правильного результата. Сначала я использую функцию RegEx, но не все URL могут быть правильно проанализированы поддоменом. Практический способ заключается в использовании списка TLDs. После того, как A TLD для A URL определен, левая часть является доменом, а оставшаяся-поддоменом.
Однако список нужно поддерживать, так как новый TLDs возможен. В настоящий момент я знаю, что publicsuffix.org поддерживает последний список, и вы можете использовать инструменты DomainName-parser из кода google, чтобы разобрать публичный список суффиксов и легко получить поддомен, домен и TLD, используя объект DomainName: domainName.SubDomain, domainName.Domain и domainName.TLD.
Этот ответ также полезен: Получить поддомен от URL
CaLLMeLaNN
Вот один из них, который является полным и не зависит ни от какого протокола.
function getServerURL(url) {
var m = url.match("(^(?:(?:.*?)?//)?[^/?#;]*)");
console.log(m[1]) // Remove this
return m[1];
}
getServerURL("http://dev.test.se")
getServerURL("http://dev.test.se/")
getServerURL("//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js")
getServerURL("//")
getServerURL("www.dev.test.se/sdas/dsads")
getServerURL("www.dev.test.se/")
getServerURL("www.dev.test.se?abc=32")
getServerURL("www.dev.test.se#abc")
getServerURL("//dev.test.se?sads")
getServerURL("http://www.dev.test.se#321")
getServerURL("http://localhost:8080/sads")
getServerURL("https://localhost:8080?sdsa")
Печать
http://dev.test.se
http://dev.test.se
//ajax.googleapis.com
//
www.dev.test.se
www.dev.test.se
www.dev.test.se
www.dev.test.se
//dev.test.se
http://www.dev.test.se
http://localhost:8080
https://localhost:8080
Мне нравится regex, который был опубликован в "Javascript: The Good Parts" году. Он не слишком короткий и не слишком сложный. Эта страница на github также имеет код JavaScript, который ее использует. Но он может быть адаптирован для любого языка. https://gist.github.com/voodooGQ/4057330
Я бы рекомендовал не использовать regex. An API вызов, подобный WinHttpCrackUrl() , менее подвержен ошибкам.
http://msdn.microsoft.com/en-us/library/aa384092%28VS.85%29.aspx
Java предлагает класс URL, который будет делать это. Запрос URL Объектов.
На боковой ноте PHP предлагает parse_url() .
Я попробовал несколько из них, которые не покрывали мои потребности, особенно самый высокий голос, который не поймал url без пути ( http://example.com/ )
кроме того, отсутствие названий групп сделало его непригодным для использования в ansible (или, возможно, мои навыки jinja2 отсутствуют).
так что это моя версия слегка измененная с источником являющимся самой высокой проголосованной версией здесь:
^((?P<protocol>http[s]?|ftp):\/)?\/?(?P<host>[^:\/\s]+)(?P<path>((\/\w+)*\/)([\w\-\.]+[^#?\s]+))*(.*)?(#[\w\-]+)?$
регулярное выражение для получения пути URL без файла.
url = ' http://domain/dir1/dir2/somefile ' url.scan(/^(http://[^/]+)((?:/[^/]+)+(?=/))?/?(?:[^/]+)?$/я).to_s
Это может быть полезно для добавления относительного пути к этому url.
Использование http://www.fileformat.info/tool/regex.htm hometoast's regex отлично работает.
Но вот в чем дело, я хочу использовать разные шаблоны regex в разных ситуациях в моей программе.
Например, у меня есть этот URL, и у меня есть перечисление, которое перечисляет все поддерживаемые URLs в моей программе. Каждый объект в перечислении имеет метод getRegexPattern, который возвращает шаблон regex, который затем будет использоваться для сравнения с URL. Если конкретный шаблон regex возвращает true, то я знаю, что этот URL поддерживается моей программой. Таким образом, каждое перечисление имеет свой собственный regex в зависимости от того, где оно должно выглядеть внутри URL.
Предложение Hometoast отлично, но в моем случае, я думаю, это не поможет (если только я не скопирую вставку того же regex во всех перечислениях).
Вот почему я хотел дать ответ regex для каждой ситуации в отдельности. Хотя +1 для родного берега. ;)
Я знаю, что вы утверждаете, что язык-агностик в этом вопросе, но не могли бы вы сказать нам, что вы используете, просто чтобы мы знали, какие regex возможности у вас есть?
Если у вас есть возможность не захватывать совпадения, вы можете изменить выражение hometoast так, чтобы подэкспрессии, которые вы не заинтересованы в захвате, были настроены следующим образом:
(?:SOMESTUFF)
Вам все равно придется скопировать и вставить (и немного изменить) Regex в несколько мест, но это имеет смысл-вы не просто проверяете, существует ли подвыражение, а скорее, если оно существует как часть URL . Использование модификатора без захвата для подвыражений может дать вам то, что вам нужно, и ничего больше, что, если я правильно вас понял, является тем, что вы хотите.
Точно так же, как маленькая-маленькая заметка, выражение hometoast не нуждается в скобках вокруг 's' для 'https', так как у него там только один символ. Кванторы количественно определяют один символ (или класс символов или подвыражение), непосредственно предшествующий им. Так:
https?
вполне подойдет 'http' или 'https'.
String s = "https://www.thomas-bayer.com/axis2/services/BLZService?wsdl";
String regex = "(^http.?://)(.*?)([/\\?]{1,})(.*)";
System.out.println("1: " + s.replaceAll(regex, "$1"));
System.out.println("2: " + s.replaceAll(regex, "$2"));
System.out.println("3: " + s.replaceAll(regex, "$3"));
System.out.println("4: " + s.replaceAll(regex, "$4"));
String s = "https://www.thomas-bayer.com/axis2/services/BLZService?wsdl";
String regex = "(^http.?://)(.*?)([/\\?]{1,})(.*)";
System.out.println("1: " + s.replaceAll(regex, "$1"));
System.out.println("2: " + s.replaceAll(regex, "$2"));
System.out.println("3: " + s.replaceAll(regex, "$3"));
System.out.println("4: " + s.replaceAll(regex, "$4"));
Обеспечит следующий выход:
1: https://
2: www.thomas-bayer.com
Три: /
4: 28?wsdl
Если вы измените значение URL на
Строка s = " https://www.thomas-bayer.com?wsdl=qwerwer&ttt=888 ";
результат будет следующим :
1: https://
2: www.thomas-bayer.com
3: ?
4: wsdl=qwerwer&ttt=888
наслаждаться..
Йоси Лев
regex, чтобы сделать полный разбор, довольно ужасно. Я включил именованные обратные ссылки для удобочитаемости и разбил каждую часть на отдельные строки, но все равно это выглядит так:
^(?:(?P<protocol>\w+(?=:\/\/))(?::\/\/))?
(?:(?P<host>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^\/?#:]+)(?::(?P<port>[0-9]+))?)\/)?
(?:(?P<path>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)\/)?
(?P<file>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)
(?:\?(?P<querystring>(?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^#])+))?
(?:#(?P<fragment>.*))?$
Дело в том, что он должен быть настолько подробным, что за исключением протокола или порта, любая из частей может содержать HTML сущностей, что делает разграничение фрагмента довольно сложным. Поэтому в последних нескольких случаях-хост, путь, файл, строка запроса и фрагмент-мы допускаем либо любую сущность html, либо любой символ, который не является ? или # . regex для объекта html выглядит следующим образом:
$htmlentity = "&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);"
Когда это извлекается (я использовал синтаксис усов, чтобы представить его), он становится немного более разборчивым:
^(?:(?P<protocol>(?:ht|f)tps?|\w+(?=:\/\/))(?::\/\/))?
(?:(?P<host>(?:{{htmlentity}}|[^\/?#:])+(?::(?P<port>[0-9]+))?)\/)?
(?:(?P<path>(?:{{htmlentity}}|[^?#])+)\/)?
(?P<file>(?:{{htmlentity}}|[^?#])+)
(?:\?(?P<querystring>(?:{{htmlentity}};|[^#])+))?
(?:#(?P<fragment>.*))?$
В JavaScript, конечно, вы не можете использовать именованные обратные ссылки, поэтому regex становится
^(?:(\w+(?=:\/\/))(?::\/\/))?(?:((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^\/?#:]+)(?::([0-9]+))?)\/)?(?:((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)\/)?((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^?#])+)(?:\?((?:(?:&(?:amp|apos|gt|lt|nbsp|quot|bull|hellip|[lr][ds]quo|[mn]dash|permil|\#[1-9][0-9]{1,3}|[A-Za-z][0-9A-Za-z]+);)|[^#])+))?(?:#(.*))?$
и в каждом совпадении протокол \1, хост \2, порт \3, путь \4, файл \5, строка запроса \6 и фрагмент \7 .
//USING REGEX
/**
* Parse URL to get information
*
* @param url the URL string to parse
* @return parsed the URL parsed or null
*/
var UrlParser = function (url) {
"use strict";
var regx = /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
matches = regx.exec(url),
parser = null;
if (null !== matches) {
parser = {
href : matches[0],
withoutHash : matches[1],
url : matches[2],
origin : matches[3],
protocol : matches[4],
protocolseparator : matches[5],
credhost : matches[6],
cred : matches[7],
user : matches[8],
pass : matches[9],
host : matches[10],
hostname : matches[11],
port : matches[12],
pathname : matches[13],
segment1 : matches[14],
segment2 : matches[15],
search : matches[16],
hash : matches[17]
};
}
return parser;
};
var parsedURL=UrlParser(url);
console.log(parsedURL);
//USING REGEX
/**
* Parse URL to get information
*
* @param url the URL string to parse
* @return parsed the URL parsed or null
*/
var UrlParser = function (url) {
"use strict";
var regx = /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
matches = regx.exec(url),
parser = null;
if (null !== matches) {
parser = {
href : matches[0],
withoutHash : matches[1],
url : matches[2],
origin : matches[3],
protocol : matches[4],
protocolseparator : matches[5],
credhost : matches[6],
cred : matches[7],
user : matches[8],
pass : matches[9],
host : matches[10],
hostname : matches[11],
port : matches[12],
pathname : matches[13],
segment1 : matches[14],
segment2 : matches[15],
search : matches[16],
hash : matches[17]
};
}
return parser;
};
var parsedURL=UrlParser(url);
console.log(parsedURL);