Expresión regular para encontrar URL dentro de una cadena

¿Alguien sabe de una expresión regular que podría usar para encontrar las URL dentro de una cadena? He encontrado muchas expresiones regulares en Google para determinar si una cadena completa es una URL, pero necesito poder buscar una cadena entera para las URL. Por ejemplo, me gustaría poder encontrar www.google.com y http://yahoo.com en la siguiente cadena:

 Hello www.google.com World http://yahoo.com 

No estoy buscando URL específicas en la cadena. Estoy buscando TODAS las URL en la cadena y por eso necesito una expresión regular.

Este es el que yo uso

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

Funciona para mí, debería funcionar para usted también.

Adivina que la expresión regular es perfecta para este uso. Encontré uno bastante sólido aquí

 /(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#\/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#\/%=~_|$?!:,.]*\)|[A-Z0-9+&@#\/%=~_|$])/igm 

Algunas diferencias / ventajas en comparación con los otros publicados aquí:

  • No coincide con las direcciones de correo electrónico
  • No coincide con el localhost: 12345
  • No detectará algo como moo.com sin http o www

Vea aquí para ejemplos

 text = """The link of this question: https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-string Also there are some urls: www.google.com, facebook.com, http://test.com/method?param=wasd The code below catches all urls in text and returns urls in list.""" urls = re.findall('(?:(?:https?|ftp):\/\/)?[\w/\-?=%.]+\.[\w/\-?=%.]+', text) print(urls) 

Salida:

 [ 'https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-string', 'www.google.com', 'facebook.com', 'http://test.com/method?param=wasd' ] 

Ninguna de las soluciones proporcionadas aquí resolvió los problemas / casos de uso que tuve.

Lo que he proporcionado aquí, es lo mejor que he encontrado / hecho hasta ahora. Lo actualizaré cuando encuentre nuevos casos extremos que no maneja.

 \b #Word cannot begin with special characters (?\w{2,10}:\/\/)? #Domains have to be of a length of 1 chars or greater ((?:\w|\&\#\d{1,5};)[.-]?)+ #The domain ending has to be between 2 to 15 characters (\.([az]{2,15}) #If no domain ending we want a port, only if a protocol is specified |(?(protocol)(?:\:\d{1,6})|(?!))) \b #Word cannot end with @ (made to catch emails) (?![@]) #We accept any number of slugs, given we have a char after the slash (\/)? #If we have endings like ?=fds include the ending (?:([\w\d\?\-=#:%@&.;])+(?:\/(?:([\w\d\?\-=#:%@&;.])+))*)? #The last char cannot be one of these symbols .,?!,- exclude these (? 

Si tiene el patrón de url, debería poder buscarlo en su cadena. Solo asegúrese de que el patrón no tenga ^ y $ marque el comienzo y el final de la cadena url. Entonces, si P es el patrón de URL, busque coincidencias para P.

Todas las respuestas anteriores no coinciden con los caracteres Unicode en la URL, por ejemplo: http://google.com?query=đức+filan+đã+search

Para la solución, este debería funcionar:

 (ftp:\/\/|www\.|https?:\/\/){1}[a-zA-Z0-9u00a1-\uffff0-]{2,}\.[a-zA-Z0-9u00a1-\uffff0-]{2,}(\S*) 

Creo que este patrón de expresiones regulares maneja precisamente lo que quieres

 /(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/ 

y este es un ejemplo de fragmento para extraer Urls:

 // The Regular Expression filter $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/"; // The Text you want to filter for urls $text = "The text you want https://stackoverflow.com/questions/6038061/regular-expression-to-find-urls-within-a-string to filter goes here."; // Check if there is a url in the text preg_match_all($reg_exUrl, $text, $url,$matches); var_dump($matches); 

Esta es una leve mejora / ajuste a (dependiendo de lo que necesite) la respuesta de Rajeev:

 ([\w\-_]+(?:(?:\.|\s*\[dot\]\s*[AZ\-_]+)+))([AZ\-\.,@?^=%&:/~\+#]*[AZ\-\@?^=%&/~\+#]){2,6}? 

Vea aquí un ejemplo de lo que hace y no coincide.

Me deshice del cheque de “http”, etc. ya que quería captar las URL sin esto. Agregué un poco a la expresión regular para capturar algunas URL ofuscadas (es decir, donde el usuario usa [punto] en lugar de un “.”). Finalmente reemplacé “\ w” con “AZ” y “{2,3}” para reducir los falsos positivos como v2.0 y “moo.0dd”.

Cualquier mejora en esta bienvenida.

Corto y simple. Todavía no lo he probado en el código de JavaScript, pero parece que funcionará:

 ((http|ftp|https):\/\/)?(([\w.-]*)\.([\w]*)) 

Código en regex101.com

Vista previa del código

Si tiene que ser estricto al seleccionar enlaces, me gustaría:

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

Para más información, lee esto:

Un patrón Regex mejorado, liberal y mejorado para las URL coincidentes

Usé esto

 ^(https?:\\/\\/([a-zA-z0-9]+)(\\.[a-zA-z0-9]+)(\\.[a-zA-z0-9\\/\\=\\-\\_\\?]+)?)$ 

Un método probablemente demasiado simplista pero funcional podría ser:

 [localhost|http|https|ftp|file]+://[\w\S(\.|:|/)]+ 

Lo probé en Python y siempre que el análisis de cadenas contenga un espacio antes y después y ninguno en la url (que nunca he visto antes) debería estar bien.

Aquí hay una identificación en línea que lo demuestra

Sin embargo, aquí hay algunos beneficios de usarlo:

  • Reconoce el file: y el localhost , así como las direcciones IP
  • Nunca coincidirá sin ellos
  • No le molestan los caracteres inusuales como # o - (ver la URL de esta publicación)

Usé la expresión regular a continuación para encontrar la URL en una cadena:

 /(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/ 

Este es el más simple. que funcionan bien para mí

 %(http|ftp|https|www)(://|\.)[A-Za-z0-9-_\.]*(\.)[az]*% 

Utilizo la lógica de encontrar texto entre dos puntos o puntos

la expresión regular a continuación funciona bien con python

 (?<=\.)[^}]*(?=\.) 

Ésta es la mejor.

 NSString *urlRegex="(http|ftp|https|www|gopher|telnet|file)(://|.)([\\w_-]+(?:(?:\\.[\\w_-]+)‌​+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?"; 

Hacer coincidir una URL en un texto no debe ser tan complejo

(?:(?:(?:ftp|http)[s]*:\/\/|www\.)[^\.]+\.[^ \n]+)

https://regex101.com/r/wewpP1/2

String regex = "[a-zA-Z0-9]+[.]([.a-zA-Z0-9])+";

Esto también funciona bien en su caso.