Можно ли использовать одно регулярное выражение для подкрепления URL-адресов и соответствия всем частям, я работал над одним и тем, что я нашел до сих пор:
(?:(?P<scheme>[a-z]*?)://)?(?:(?P<username>.*?):?(?P<password>.*?)[email protected])?(?P<hostname>.*?)/(?:(?:(?P<path>.*?)\?)?(?P<file>.*?\.[a-z]{1,6})?(?:(?:(?P<query>.*?)#?)?(?P<fragment>.*?)?)?)?
однако это не сработает, оно должно соответствовать всем следующим примерам:
http://username:[email protected]/path?arg=value#anchor
http://www.domain.com/
http://www.doamin.co.uk/
http://www.yahoo.com/
http://www.google.au/
https://username:[email protected]/
ftp://user:[email protected]/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
почты://[email protected]
и предоставить именованный захват для всех компонентов:
например. http https ftp ftps callto mailto и любой другой, который не указан
имя пользователя
пароль
имя хоста, включая поддомены, domain и tld
путь eg/images/profile/
filename, например file.ext
строка запроса, например.? foo = bar & bar = foo
фрагмент, например. #anchor
Если имя хоста является единственным обязательным полем.
Мы можем предположить, что это происходит из формы, специально запрашивающей URL-адрес, и не будет использоваться для поиска ссылок в тексте.