Regex для проверки URL с захватом частей - PullRequest
4 голосов
/ 14 января 2009

Можно ли использовать одно регулярное выражение для проверки URL-адресов и сопоставления всех частей, я работал над одной и до сих пор придумал:

(?:(?P<scheme>[a-z]*?)://)?(?:(?P<username>.*?):?(?P<password>.*?)?@)?(?P<hostname>.*?)/(?:(?:(?P<path>.*?)\?)?(?P<file>.*?\.[a-z]{1,6})?(?:(?:(?P<query>.*?)#?)?(?P<fragment>.*?)?)?)?

однако это не работает, оно должно соответствовать всем следующим примерам:

http://username:password@hostname.tld/path?arg=value#anchor
http://www.domain.com/
http://www.doamin.co.uk/
http://www.yahoo.com/
http://www.google.au/
https://username:password@domain.com/
ftp: // пользователь: password@domain.com/path/
https://www.blah1.subdoamin.doamin.tld/
domain.tld / # anchor
doamin.tld /? query = 123
domain.co.uk/
domain.tld
http://www.domain.tld/index.php?var1=blah
http://www.domain.tld/path/to/index.ext
почты: //user@unkwndesign.com

и предоставить именованный захват для всех компонентов:

схема например. http https ftp ftps callto mailto и любые другие, не перечисленные
имя пользователя
пароль
имя хоста, включая субдомены, домен и т. д.
путь например / images / profile /
имя файла, например, file.ext
строка запроса, например. ? foo = bar & bar = foo
фрагмент например # Якорь

С именем хоста в качестве единственного обязательного поля.

Мы можем предположить, что это исходит из формы, специально запрашивающей URL, и не будет использоваться для поиска ссылок в тексте.

Ответы [ 2 ]

12 голосов
/ 14 января 2009

Можно ли использовать одно регулярное выражение для проверки URL-адресов и сопоставления всех частей

номер

регулярное выражение strager впечатляет, но, в конце концов, оно менее читабельно, обслуживаемо и надежно, чем просто использование правильного парсера URI. Он обязательно отклоняет допустимые URI и принимает строки, которые не являются URI, потому что правила форматирования URI не могут быть полностью выражены в регулярном выражении.

электронная почта: //user@unkwndesign.com

В почтовом URI не должно быть '//'. Вы не можете сказать, в каком формате будет остаток (post- :) URI, пока не прочитаете схему; многие схемы URI не соответствуют формату credentials @ host / path. Лучше всего принимать только конкретные схемы, когда вы знаете, как анализировать их URI.

6 голосов
/ 14 января 2009

Модифицированная версия регулярного выражения mingfai :

/^((?P<scheme>https?|ftp):\/)?\/?((?P<username>.*?)(:(?P<password>.*?)|)@)?(?P<hostname>[^:\/\s]+)(?P<port>:([^\/]*))?(?P<path>(\/\w+)*\/)(?P<filename>[-\w.]+[^#?\s]*)?(?P<query>\?([^#]*))?(?P<fragment>#(.*))?$/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...