Procurando uma expressão regular para extrair URIs válidos de HTTP de um arquivo?

3

Eu estou procurando uma expressão regular que pode extrair http URIs de um arquivo (texto arbitrário). Observe que o texto pode ter a palavra "http", mas essa palavra pode ou não representar um endereço URI válido.

UPDATE: Eu entendo que HTML é uma gramática livre de contexto, enquanto RegEx é uma expressão regular, mas são URIs são apenas padrões (expressão regular). Ou não?

    
por Seno 07.06.2011 / 01:03

2 respostas

1

É mais difícil do que você pensa e nenhuma expressão regular é levada para pegá-los todos.
Considere URLs como este

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

ftp://joe:[email protected]

google.ru

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

Aqui está um bom artigo sobre o assunto Um bom URL expressão regular?

^(?#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})*)?$

Aqui está outro um pouco mais curto de Um padrão de Regex preciso e melhorado para URLs correspondentes

(?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'!()\[\]{};:'".,<>?«»“”‘’]))
    
por 07.06.2011 / 09:30
0

Talvez algo assim:

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

Tags