¿Alguien sabe de una expresión regular que pueda usar para encontrar URL dentro de una cadena? Encontré muchas expresiones regulares en Google para determinar si una cadena completa es una URL, pero necesito poder buscar URL en una cadena completa. 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, por eso necesito una expresión regular.
Respuestas:
Este es el que yo uso
Funciona para mí, debería funcionar para ti también.
fuente
\w
pueden no coincidir con los símbolos internacionales (depende del motor de expresiones regulares), es necesaria la gama en su lugar:a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF
.[\w_-]
ser[\w-]
? porque ya\w
coincide_
. por documentos de mozillawww.yahoo.com
."""(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?""".r.findAllIn("www.google.com").toList
. TAMBIÉN FALTA EXPLICACIÓN para la respuestaSupongo que ninguna expresión regular es perfecta para este uso. Encontré uno bastante sólido aquí
Algunas diferencias / ventajas en comparación con las otras publicadas aquí:
moo.com
sinhttp
owww
Vea aquí para ver ejemplos
fuente
g
opción no es válida en todas las implementaciones de expresiones regulares (por ejemplo, la implementación incorporada de Ruby).text = """The link of this question: /programming/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:
[ '/programming/6038061/regular-expression-to-find-urls-within-a-string', 'www.google.com', 'facebook.com', 'http://test.com/method?param=wasd' ]
fuente
&
parámetros en la URL. por ejemplo,http://test.com/method?param=wasd¶m2=wasd2
pierde param2Ninguna de las soluciones proporcionadas aquí resolvió los problemas / casos de uso que tenía.
Lo que he proporcionado aquí es lo mejor que he encontrado / hecho hasta ahora. Lo actualizaré cuando encuentre nuevos casos extremos que no maneje.
\b #Word cannot begin with special characters (?<![@.,%&#-]) #Protocols are optional, but take them with us if they are present (?<protocol>\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 (\.([a-z]{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 (?<![.,?!-])
fuente
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 URL:
// 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 /programming/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);
fuente
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*)
fuente
Si tiene que ser estricto en la selección de enlaces, optaría por:
(?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`!()\[\]{};:'".,<>?«»“”‘’]))
Para más información, lea esto:
Un patrón de expresiones regulares preciso y liberal mejorado para URL coincidentes
fuente
Encontré esto que cubre la mayoría de los enlaces de muestra, incluidas las partes del subdirectorio.
Regex es:
(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))?
fuente
Si tiene el patrón de URL, debería poder buscarlo en su cadena. Sólo asegúrese de que el patrón imposible tener
^
y$
que marca el comienzo y final de la cadena URL. Entonces, si P es el patrón de URL, busque coincidencias para P.fuente
^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$
http://regexpal.com/
; allí puede probar diferentes expresiones contra su cadena hasta que lo haga bien.Community
pestaña, incluidas las de URLUsé la siguiente expresión regular para encontrar la URL en una cadena:
/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/
fuente
[a-zA-Z]{2,3}
es realmente deficiente para los TLD coincidentes, consulte la lista oficial: data.iana.org/TLD/tlds-alpha-by-domain.txtAquí una expresión regular un poco más optimizada:
(?:(?:(https?|ftp|file):\/\/|www\.|ftp\.)|([\w\-_]+(?:\.|\s*\[dot\]\s*[A-Z\-_]+)+))([A-Z\-\.,@?^=%&:\/~\+#]*[A-Z\-\@?^=%&\/~\+#]){2,6}?
Aquí está la prueba con datos: https://regex101.com/r/sFzzpY/6
fuente
Corto y sencillo. Todavía no lo he probado en código javascript, pero parece que funcionará:
((http|ftp|https):\/\/)?(([\w.-]*)\.([\w]*))
Código en regex101.com
fuente
Yo uso esta expresión regular:
/((\w+:\/\/\S+)|(\w+[\.:]\w+\S+))[^\s,\.]/ig
Funciona bien para muchas URL, como: http://google.com , https://dev-site.io:8080/home?val=1&count=100 , www.regexr.com, localhost: 8080 / path,. ..
fuente
Esta es una ligera mejora en / ajuste a (dependiendo de lo que necesite) la respuesta de Rajeev:
([\w\-_]+(?:(?:\.|\s*\[dot\]\s*[A-Z\-_]+)+))([A-Z\-\.,@?^=%&:/~\+#]*[A-Z\-\@?^=%&/~\+#]){2,6}?
Ver aquí un ejemplo de lo que hace y lo que no coincide.
Me deshice de la comprobación de "http", etc., ya que quería capturar 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.
fuente
[a-zA-Z]{2,3}
es realmente deficiente para los TLD coincidentes, consulte la lista oficial: data.iana.org/TLD/tlds-alpha-by-domain.txt . Además, sus coincidencias de expresiones regulares_.........&&&&&&
no están seguras de que sea una URL válida.Un método de trabajo probablemente demasiado simplista 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 antes había visto) debería estar bien.
Aquí hay un ide en línea que lo demuestra
Sin embargo, aquí hay algunos beneficios de usarlo:
file:
ylocalhost
también direcciones IP.#
o-
(ver url de esta publicación)fuente
El uso de la expresión regular proporcionada por @JustinLevene no tenía las secuencias de escape adecuadas en las barras diagonales inversas. Se actualizó para que ahora sea correcto, y se agregó en condición para que coincida también con el protocolo FTP: coincidirá con todas las URL con o sin protocolos, y sin "www".
Código:
^((http|ftp|https):\/\/)?([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?
Ejemplo: https://regex101.com/r/uQ9aL4/65
fuente
MEJORADO
Detecta URL como estas:
Regex:
/^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$/gm
fuente
Escribí uno yo mismo:
let regex = /([\w+]+\:\/\/)?([\w\d-]+\.)*[\w-]+[\.\:]\w+([\/\?\=\&\#]?[\w-]+)*\/?/gm
Funciona en TODOS los siguientes dominios:
https://www.facebook.com https://app-1.number123.com http://facebook.com ftp://facebook.com http://localhost:3000 localhost:3000/ unitedkingdomurl.co.uk this.is.a.url.com/its/still=going?wow shop.facebook.org app.number123.com app1.number123.com app-1.numbEr123.com app.dashes-dash.com www.facebook.com facebook.com fb.com/hello_123 fb.com/hel-lo fb.com/hello/goodbye fb.com/hello/goodbye?okay fb.com/hello/goodbye?okay=alright Hello www.google.com World http://yahoo.com https://www.google.com.tr/admin/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services https://google.com.tr/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services http://google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services ftp://google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services www.google.com.tr/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services www.google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services drive.google.com/test/subPage?qs1=sss1&qs2=sss2&qs3=sss3#Services https://www.example.pl http://www.example.com www.example.pl example.com http://blog.example.com http://www.example.com/product http://www.example.com/products?id=1&page=2 http://www.example.com#up http://255.255.255.255 255.255.255.255
Puede ver cómo funciona aquí en regex101 y ajustar según sea necesario
fuente
Utilizo la lógica de buscar texto entre dos puntos o puntos.
la expresión regular a continuación funciona bien con Python
(?<=\.)[^}]*(?=\.)
fuente
Hacer coincidir una URL en un texto no debería ser tan complejo
(?:(?:(?:ftp|http)[s]*:\/\/|www\.)[^\.]+\.[^ \n]+)
https://regex101.com/r/wewpP1/2
fuente
Usé esto
^(https?:\\/\\/([a-zA-z0-9]+)(\\.[a-zA-z0-9]+)(\\.[a-zA-z0-9\\/\\=\\-\\_\\?]+)?)$
fuente
(?:vnc|s3|ssh|scp|sftp|ftp|http|https)\:\/\/[\w\.]+(?:\:?\d{0,5})|(?:mailto|)\:[\w\.]+\@[\w\.]+
Si quieres una explicación de cada parte, prueba en regexr [.] Com donde obtendrás una gran explicación de cada carácter.
Esto está dividido por un "|" u "OR" porque no todos los URI utilizables tienen "//", por lo que aquí es donde puede crear una lista de esquemas o condiciones que le interesaría hacer coincidir.
fuente
He utilizado la clase c # Uri y funciona, bien con la dirección IP, localhost
public static bool CheckURLIsValid(string url) { Uri returnURL; return (Uri.TryCreate(url, UriKind.Absolute, out returnURL) && (returnURL.Scheme == Uri.UriSchemeHttp || returnURL.Scheme == Uri.UriSchemeHttps)); }
fuente
Me gustó la solución de Stefan Henze, pero obtendría 34,56. Es demasiado general y no he analizado html. Hay 4 anclajes para una URL;
www ,
http: \ (y co),
. seguido de letras y luego /,
o letras. y uno de estos: https://ftp.isc.org/www/survey/reports/current/bynum.txt .
Usé mucha información de este hilo. Gracias a todos.
"(((((http|ftp|https|gopher|telnet|file|localhost):\\/\\/)|(www\\.)|(xn--)){1}([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(([\\w_-]{2,200}(?:(?:\\.[\\w_-]+)*))((\\.[\\w_-]+\\/([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(\\.((org|com|net|edu|gov|mil|int|arpa|biz|info|unknown|one|ninja|network|host|coop|tech)|(jp|br|it|cn|mx|ar|nl|pl|ru|tr|tw|za|be|uk|eg|es|fi|pt|th|nz|cz|hu|gr|dk|il|sg|uy|lt|ua|ie|ir|ve|kz|ec|rs|sk|py|bg|hk|eu|ee|md|is|my|lv|gt|pk|ni|by|ae|kr|su|vn|cy|am|ke))))))(?!(((ttp|tp|ttps):\\/\\/)|(ww\\.)|(n--)))"
Arriba resuelve casi todo excepto una cadena como "eurls: www.google.com, facebook.com, http: //test.com/", que devuelve como una sola cadena. Tbh idk por qué agregué Gopher, etc. Código de prueba R
if(T){ wierdurl<-vector() wierdurl[1]<-"https://JP納豆.例.jp/dir1/納豆 " wierdurl[2]<-"xn--jp-cd2fp15c.xn--fsq.jp " wierdurl[3]<-"http://52.221.161.242/2018/11/23/biofourmis-collab" wierdurl[4]<-"https://12000.org/ " wierdurl[5]<-" https://vg-1.com/?page_id=1002 " wierdurl[6]<-"https://3dnews.ru/822878" wierdurl[7]<-"The link of this question: /programming/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. " wierdurl[8]<-"Thelinkofthisquestion:/programming/6038061/regular-expression-to-find-urls-within-a-string Alsotherearesomeurls:www.google.com,facebook.com,http://test.com/method?param=wasd Thecodebelowcatchesallurlsintextandreturnsurlsinlist. " wierdurl[9]<-"Thelinkofthisquestion:/programming/6038061/regular-expression-to-find-urls-within-a-stringAlsotherearesomeurlsZwww.google.com,facebook.com,http://test.com/method?param=wasdThecodebelowcatchesallurlsintextandreturnsurlsinlist." wierdurl[10]<-"1facebook.com/1res" wierdurl[11]<-"1facebook.com/1res/wat.txt" wierdurl[12]<-"www.e " wierdurl[13]<-"is this the file.txt i need" wierdurl[14]<-"xn--jp-cd2fp15c.xn--fsq.jpinspiredby " wierdurl[15]<-"[xn--jp-cd2fp15c.xn--fsq.jp/inspiredby " wierdurl[16]<-"xnto--jpto-cd2fp15c.xnto--fsq.jpinspiredby " wierdurl[17]<-"fsety--fwdvg-gertu56.ffuoiw--ffwsx.3dinspiredby " wierdurl[18]<-"://3dnews.ru/822878 " wierdurl[19]<-" http://mywebsite.com/msn.co.uk " wierdurl[20]<-" 2.0http://www.abe.hip " wierdurl[21]<-"www.abe.hip" wierdurl[22]<-"hardware/software/data" regexstring<-vector() regexstring[2]<-"(http|ftp|https)://([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?" regexstring[3]<-"/(?:(?:https?|ftp|file):\\/\\/|www\\.|ftp\\.)(?:\\([-A-Z0-9+&@#\\/%=~_|$?!:,.]*\\)|[-A-Z0-9+&@#\\/%=~_|$?!:,.])*(?:\\([-A-Z0-9+&@#\\/%=~_|$?!:,.]*\\)|[A-Z0-9+&@#\\/%=~_|$])/igm" regexstring[4]<-"[a-zA-Z0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]?" regexstring[5]<-"((http|ftp|https)\\:\\/\\/)?([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?" regexstring[6]<-"((http|ftp|https):\\/\\/)?([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?" regexstring[7]<-"(http|ftp|https)(:\\/\\/)([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?" regexstring[8]<-"(?:(?:https?|ftp|file):\\/\\/|www\\.|ftp\\.)(?:\\([-A-Z0-9+&@#/%=~_|$?!:,.]*\\)|[-A-Z0-9+&@#/%=~_|$?!:,.])*(?:\\([-A-Z0-9+&@#/%=~_|$?!:,.]*\\)|[A-Z0-9+&@#/%=~_|$])" regexstring[10]<-"((http[s]?|ftp):\\/)?\\/?([^:\\/\\s]+)((\\/\\w+)*\\/)([\\w\\-\\.]+[^#?\\s]+)(.*)?(#[\\w\\-]+)?" regexstring[12]<-"http[s:/]+[[:alnum:]./]+" regexstring[9]<-"http[s:/]+[[:alnum:]./]+" #in DLpages 230 regexstring[1]<-"[[:alnum:]-]+?[.][:alnum:]+?(?=[/ :])" #in link_graphs 50 regexstring[13]<-"^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$" regexstring[14]<-"(((((http|ftp|https):\\/\\/)|(www\\.)|(xn--)){1}([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(([\\w_-]+(?:(?:\\.[\\w_-]+)*))((\\.((org|com|net|edu|gov|mil|int)|(([:alpha:]{2})(?=[, ]))))|([\\/]([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?))))(?!(((ttp|tp|ttps):\\/\\/)|(ww\\.)|(n--)))" regexstring[15]<-"(((((http|ftp|https|gopher|telnet|file|localhost):\\/\\/)|(www\\.)|(xn--)){1}([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(([\\w_-]{2,200}(?:(?:\\.[\\w_-]+)*))((\\.[\\w_-]+\\/([\\w.,@?^=%&:\\/~+#-]*[\\w@?^=%&\\/~+#-])?)|(\\.((org|com|net|edu|gov|mil|int|arpa|biz|info|unknown|one|ninja|network|host|coop|tech)|(jp|br|it|cn|mx|ar|nl|pl|ru|tr|tw|za|be|uk|eg|es|fi|pt|th|nz|cz|hu|gr|dk|il|sg|uy|lt|ua|ie|ir|ve|kz|ec|rs|sk|py|bg|hk|eu|ee|md|is|my|lv|gt|pk|ni|by|ae|kr|su|vn|cy|am|ke))))))(?!(((ttp|tp|ttps):\\/\\/)|(ww\\.)|(n--)))" } for(i in wierdurl){#c(7,22) for(c in regexstring[c(15)]) { print(paste(i,which(regexstring==c))) print(str_extract_all(i,c)) } }
fuente
Ésta es la mejor.
NSString *urlRegex="(http|ftp|https|www|gopher|telnet|file)(://|.)([\\w_-]+(?:(?:\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?";
fuente
Este es el más simple. que funcionan para mí bien.
%(http|ftp|https|www)(://|\.)[A-Za-z0-9-_\.]*(\.)[a-z]*%
fuente
Es simplemente simple.
Utilice este patrón:
\b((ftp|https?)://)?([\w-\.]+\.(com|net|org|gov|mil|int|edu|info|me)|(\d+\.\d+\.\d+\.\d+))(:\d+)?(\/[\w-\/]*(\?\w*(=\w+)*[&\w-=]*)*(#[\w-]+)*)?
Coincide con cualquier enlace que contenga:
Protocolos permitidos: http, https y ftp
Dominios permitidos: * .com, * .net, * .org, * .gov, * .mil, * .int, * .edu, * .info y * .me O IP
Puertos permitidos: verdadero
Parámetros permitidos: verdadero
Hashes permitidos: verdadero
fuente