3

Я ищу регулярное выражение, которое может извлечь http URI из файла (произвольный текст). Обратите внимание, что текст может иметь слово "http", но это слово может представлять или не представлять действительный адрес URI.

ОБНОВЛЕНИЕ: я понимаю, что HTML является контекстно-свободной грамматикой, в то время как RegEx является регулярным выражением, но URI являются просто шаблонами (регулярным выражением). Или нет?

2 ответа2

1

Это сложнее, чем вы думаете, и никакое регулярное выражение не может легко поймать их всех.
Рассмотрим URL, как это

http://www.google.com/search?q=good+url+regex&rls=com.microsoft:* & ie = UTF-8 & oe = UTF-8 & startIndex = & startPage = 1

FTP:// джо:password@ftp.filetransferprotocal.com

google.ru

https://some-url.com?query=&name=joe?filter= . #some_anchor

Вот хорошая короткая статья на эту тему . Хорошее ли регулярное выражение URL?

^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)  
(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)  
(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|  
[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]  
|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])  
+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?  
(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]  
|%[a-f\d]{2})*)?$

Вот еще один, чуть короче из «Улучшенного либерального шаблона точных регулярных выражений для сопоставления URL».

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.]  
[a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+  
(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))
0

Может быть, что-то вроде этого:

(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .