¿Busca una expresión regular para extraer URIs válidos de http de un archivo?

3

Estoy buscando una expresión regular que pueda extraer URI de http de un archivo (texto arbitrario). Tenga en cuenta que el texto puede tener la palabra "http", pero esa palabra puede o no representar una dirección URI válida.

ACTUALIZACIÓN: entiendo que HTML es una gramática libre de contexto, mientras que RegEx es una expresión regular pero que los URI son solo patrones (expresión regular). ¿O no?

Seno
fuente
3
Me gustaría señalar que usar expresiones regulares cuando no son apropiadas puede causar locura . Lo que está pidiendo no es posible con el 100% de precisión.
Zoredache
Entiendo que HTML es una gramática libre de contexto, mientras que RegEx es una expresión regular pero que los URI son solo patrones (expresión regular). ¿O no?
Seno
1
@Zoredache, ¿qué eres? loco ‽ ¿No haces expresiones regulares por diversión?
Synetech
1
Siempre que se limite a las URL bien formadas, incluidos los prefijos de protocolo (preferiblemente restringidos a un conjunto específico de protocolos), las expresiones regulares pueden hacer un buen trabajo con esto (y muchos sitios los usan solo para eso). Pero el 100% de precisión todavía no es posible debido a cosas como " Found this at http://somesite.com/foo. ", donde ni las expresiones regulares ni las gramáticas libres de contexto pueden determinar de manera confiable si". "final debe ser parte de la URL o no y es poco probable que el enlace funcione si el analizador se equivoca.
Dave Sherohman

Respuestas:

1

Es más difícil de lo que piensas y ninguna expresión regular es tan fácil de atraparlos a todos.
Considera las URL como esta

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

ftp: // joe: [email protected]

google.ru

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

Aquí hay un buen artículo corto sobre el tema. ¿Una buena expresión regular de 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})*)?$

Aquí hay otro un poco más corto de Un patrón mejorado y exacto de expresiones regulares para URL coincidentes

(?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`!()\[\]{};:'".,<>?«»“”‘’]))
Nifle
fuente
Me gusta cómo los superusuarios (basados ​​en expresiones regulares) resaltan / autoenlaces y fallan en sus ejemplos, lo malos que son las expresiones regulares para encontrar enlaces :)
zhenech
0

Tal vez algo como esto:

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