¿Cómo puedo verificar si una cadena dada es una dirección URL válida?
Mi conocimiento de las expresiones regulares es básico y no me permite elegir entre los cientos de expresiones regulares que ya he visto en la web.
regex
url
language-agnostic
Vitor Silva
fuente
fuente
Respuestas:
Escribí mi patrón de URL (en realidad IRI, internacionalizado) para cumplir con RFC 3987 ( http://www.faqs.org/rfcs/rfc3987.html ). Estos están en sintaxis PCRE.
Para IRI absolutos (internacionalizados):
Para permitir también IRI relativos:
Cómo fueron compilados (en PHP):
Edición 7 de marzo de 2011: debido a la forma en que PHP maneja las barras diagonales inversas en las cadenas entre comillas, estas no se pueden usar de forma predeterminada. Tendrá que escapar dos barras invertidas, excepto cuando la barra diagonal inversa tenga un significado especial en expresiones regulares. Puedes hacerlo de esta manera:
fuente
http://com
es una URL válida.http://localhost
es decir, ¿por qué no serían otras palabras? Tienes razón en que elu
modificador es necesario en PHP. Quiero dejar claro que si bien los generé con PHP, no están destinados a ser específicos de PHP.Acabo de escribir una publicación de blog para una gran solución para reconocer las URL en los formatos más utilizados, como:
www.google.com
http://www.google.com
mailto:[email protected]
[email protected]
www.url-with-querystring.com/?url=has-querystring
La expresión regular utilizada es:
fuente
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/
width:210px;
ymargin:3px
Que plataforma Si usa .NET, use
System.Uri.TryCreate
, no una expresión regular.Por ejemplo:
(Gracias a @Yoshi por el consejo sobre
javascript:
)fuente
javascript: alert('blah')
. Debe realizar una validación adicional en Uri.Scheme para confirmar que se está utilizando el protocolo http / https / ftp; de lo contrario, si se inserta dicha URL en el HTML de sus páginas ASP.NET como un enlace, sus usuarios son vulnerables a los ataques XSS .Uri.IsWellFormedUriString()
Esto es lo que usa RegexBuddy .
Coincide con estos a continuación (dentro de las
** **
marcas):Puede descargar RegexBuddy en http://www.regexbuddy.com/download.html .
fuente
/\b(https?|ftp|file):\/\/[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]/
Con respecto a los párpados de respuesta de que dice "Esto se basa en mi lectura de la especificación de URI": Gracias Parpado, ¡la suya es la solución perfecta que busqué, ya que se basa en la especificación de URI! Excelente trabajo. :)
Tuve que hacer dos enmiendas. El primero en hacer que la expresión regular coincida correctamente con las direcciones URL de las direcciones IP en PHP (v5.2.10) con la función preg_match ().
Tuve que agregar un par de paréntesis más a la línea sobre "Dirección IP" alrededor de las tuberías:
No estoy seguro de por qué.
También he reducido la longitud mínima del dominio de nivel superior de 3 a 2 letras para admitir .co.uk y similares.
Código final:
Esta versión modificada no se comparó con la especificación de URI, por lo que no puedo garantizar su cumplimiento, se modificó para manejar URL en entornos de red local y TLD de dos dígitos, así como otros tipos de URL web, y para funcionar mejor en PHP configuración que uso.
Como código PHP :
Aquí hay un programa de prueba en PHP que valida una variedad de URL usando la expresión regular:
Gracias de nuevo a los párpados por la expresión regular!
fuente
')((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
con')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
". Hice la edición relevante en base a este comentario./^(https?|ftp):
(protocolo) ¿Por qué no permite protocolos como datos, archivos, svn, dc ++, magnet, skype o cualquier otro compatible con un navegador que tenga el complemento o servidor correspondiente?Mathias Bynens tiene un excelente artículo sobre la mejor comparación de muchas expresiones regulares: en busca de la expresión regular de validación de URL perfecta
El mejor publicado es un poco largo, pero coincide con casi cualquier cosa que puedas lanzarle.
Versión de JavaScript
Versión PHP
fuente
%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu
La publicación Obteniendo partes de una URL (Regex) analiza el análisis de una URL para identificar sus diversos componentes. Si desea verificar si una URL está bien formada, debería ser suficiente para sus necesidades.
Si necesita verificar si es realmente válido, eventualmente tendrá que intentar acceder a lo que esté en el otro extremo.
Sin embargo, en general, probablemente sea mejor usar una función que le proporciona su marco u otra biblioteca. Muchas plataformas incluyen funciones que analizan las URL. Por ejemplo, está el módulo urlparse de Python , y en .NET podría usar el constructor de la clase System.Uri como un medio para validar la URL.
fuente
Esto podría no ser un trabajo para expresiones regulares, sino para herramientas existentes en el idioma de su elección. Probablemente desee utilizar el código existente que ya se ha escrito, probado y depurado.
En PHP, usa la
parse_url
función.Perl:
URI
módulo .Ruby:
URI
módulo ..NET: clase 'Uri'
Las expresiones regulares no son una varita mágica que agitas en cada problema que involucra cuerdas.
fuente
java.net.URL
.Analizador de referencia de URI sin validación
Para fines de referencia, aquí está la especificación IETF: ( TXT | HTML ). En particular, el Apéndice B. Analizar una referencia de URI con una expresión regular muestra cómo analizar una expresión regular válida . Esto se describe como,
Aquí está la expresión regular que proporcionan:
Como alguien más dijo, probablemente sea mejor dejar esto en un lib / framework que ya está utilizando.
fuente
Esto coincidirá con todas las URL
... incluidos los subdominios y las nuevas extensiones de nombre de dominio de nivel superior como. museo ,. academia ,. fundación , etc., que pueden tener hasta 63 caracteres (no sólo. com ,. net ,. info , etc.)
Porque hoy la longitud máxima de la extensión de nombre de dominio de nivel superior disponible es de 13 caracteres como. internacional , puede cambiar el número 63 en expresión a 13 para evitar que alguien lo use incorrectamente.
como javascript
Artículo de Wikipedia: Lista de todos los dominios de nivel superior de Internet
fuente
t.co
. ¿Cómo lo ajustarías para manejar este caso?La mejor expresión regular para URL para mí sería:
fuente
(([\\w]+:)?//)?(([\\d\\w]|%[a-fA-f\\d]{2,2})+(:([\\d\\w]|%[a-fA-f\\d]{2,2})+)?@)?([\\d\\w][-\\d\\w]{0,253}[\\d\\w]\\.)+[\\w]{2,4}(:[\\d]+)?(/([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)*(\\?(&?([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})=?)*)?(#([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)?
\w
con\p{L}
como mínimo.([\d\w][-\d\w]{0,253}[\d\w]\.)+
en([\d\w][-\d\w]{0,253}[\d\w]?\.)+
(añadir un signo de interrogación cerca del final de la misma)Coincide con http://site.com/dir/file.php?var=moo | ftp: // usuario: [email protected]: 21 / file / dir
Non-Matches site.com | http://site.com/dir//
fuente
http://www.goo gle.com
coincidirá.Partidos http://www.asdah.com/~joe | ftp://ftp.asdah.co.uk:2828/asdah%20asdah.gif | https://asdah.gov/asdh-ah.as
fuente
No pude encontrar la expresión regular que estaba buscando, así que modifiqué una expresión regular para cumplir con mis requisitos, y aparentemente parece funcionar bien ahora. Mis requisitos fueron:
Aquí lo que se me ocurrió, cualquier sugerencia es apreciada:
fuente
Si realmente busca la coincidencia definitiva , probablemente la encuentre en "¿ Una buena expresión regular de URL? ".
Pero una expresión regular que realmente coincide con todos los dominios posibles y permite todo lo que está permitido según los RFC es horriblemente largo e ilegible, créanme ;-)
fuente
He estado trabajando en un artículo en profundidad sobre la validación de URI usando expresiones regulares. Se basa en RFC3986.
Validación de URI de expresión regular
Aunque el artículo aún no está completo, se me ocurrió una función PHP que hace un buen trabajo al validar las URL HTTP y FTP. Aquí está la versión actual:
Esta función utiliza dos expresiones regulares; uno para hacer coincidir un subconjunto de URI genéricos válidos (los absolutos que tienen un host no vacío), y un segundo para validar el nombre de host DNS "partes separadas por puntos". Aunque esta función actualmente solo valida esquemas HTTP y FTP, está estructurada de tal manera que se puede extender fácilmente para manejar otros esquemas.
fuente
Escribí una pequeña versión maravillosa que puedes ejecutar
coincide con las siguientes URL (que es lo suficientemente bueno para mí)
http://google.com
http://google.com/help.php
http://google.com/help.php?a=5
http://www.google.com
http://www.google.com/help.php
http://www.google.com?a=5
google.com?a=5
google.com/help.php
google.com/help.php?a=5
http://www.m.google.com/help.php?a=5 (y todas sus permutaciones)
www.m.google.com/help.php?a=5 (y todas sus permutaciones)
m.google.com/help.php?a=5 (y todas sus permutaciones)
Lo importante para las URL que no comienzan con http o www es que deben incluir una / o?
Apuesto a que esto se puede ajustar un poco más, pero hace el trabajo bastante bueno por ser tan corto y compacto ... porque puedes dividirlo en 3:
encuentre cualquier cosa que comience con http: https?: // w {0,3} \ w *?. \ w {2,3} \ S *
encuentre cualquier cosa que comience con www: www. \ w *?. \ w {2,3} \ S *
o encuentra algo que debe tener un texto, luego un punto, al menos 2 letras y luego un? o /: \ w *?. \ w {2,3} [/ \?] \ S *
fuente
-
en URL.Yo uso esta expresión regular:
Para apoyar a ambos:
Y:
fuente
((https?:)?(\/?\/))(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
((?:https?:)?(?:\/?\/))((?:[\d\w]|%[a-fA-f\d]{2,2})+(?::(?:[\d\w]|%[a-fA-f\d]{2,2})+)?@)?((?:[\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63})(:[\d]+)?(\/(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(?:&?(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
Aquí hay una buena regla que cubre todos los casos posibles: puertos, parámetros y etc.
fuente
Este me funciona muy bien.
(https?|ftp)://(www\d?|[a-zA-Z0-9]+)?\.[a-zA-Z0-9-]+(\:|\.)([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?
fuente
Aquí hay una versión Java lista para usar del código fuente de Android. Este es el mejor que he encontrado.
fuente
Aquí hay una expresión regular que hice que extrae las diferentes partes de una URL:
^((?:https?|ftp):\/\/?)?([^:/\s.]+\.[^:/\s]|localhost)(:\d+)?((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?([^#]+)?(#[\w-]+)?$
((?:https?|ftp):\/\/?)?
(grupo 1) : extrae el protocolo([^:/\s.]+\.[^:/\s]|localhost)
(grupo 2) : extrae el nombre de host(:\d+)?
(grupo 3) : extrae el número de puerto((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?
(grupos 4 y 5) : extrae la parte de ruta([^#]+)?
(grupo 6) : extrae la parte de consulta(#[\w-]+)?
(grupo 7) : extrae la parte hashPara cada parte de la expresión regular enumerada anteriormente, puede eliminar el final
?
para forzarlo (o agregar uno para que sea facultativo). También puede eliminar^
al principio y$
al final de la expresión regular para que no tenga que coincidir con toda la cadena.Véalo en regex101 .
Nota: esta expresión regular no es 100% segura y puede aceptar algunas cadenas que no son necesariamente URL válidas, pero de hecho valida algunos criterios. Su objetivo principal era extraer las diferentes partes de una URL para no validarla.
fuente
Para Python, esta es la expresión regular de validación de URL utilizada en Django 1.5.1:
Esto hace tanto las direcciones ipv4 como ipv6, así como los puertos y los parámetros GET.
Encontrado en el código aquí , Línea 44.
fuente
Encontré el siguiente Regex para URL, probado con éxito con más de 500 URL :
/\b(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\b/gi
Sé que se ve feo, pero lo bueno es que funciona. :)
Explicación y demostración con 581 URL aleatorias en regex101.
Fuente: En busca de la regex de validación de URL perfecta
fuente
/(https?):\/\/([\w-]+(\.[\\w-]+)*\.([a-z]+))(([\w.,@?^=%&:\/~+#()!-]*)([\w@?^=%&\/~+#()!-]))?/gi
Traté de formular mi versión de url. Mi requisito era capturar instancias en una Cadena donde la url posible puede ser cse.uom.ac.mu, teniendo en cuenta que no está precedida por http ni www
fuente
ht{2}ps?
lugar de esohttps?
¿Qué hay de malo con FILTER_VALIDATE_URL simple y llanamente?
Sé que no es exactamente la pregunta, pero funcionó para mí cuando necesitaba validar las URL, por lo que pensé que podría ser útil para otros que se encuentran con esta publicación buscando lo mismo
fuente
El siguiente RegEx funcionará:
fuente
Usa este, está funcionando para mí
fuente
Por conveniencia, aquí hay una expresión regular de una sola línea para URL que también coincidirá con localhost donde es más probable que tenga puertos que
.com
o similares.fuente
No especificas qué idioma estás usando. Si PHP es, hay una función nativa para eso:
Devuelve los datos filtrados, o FALSE si el filtro falla.
Compruébalo aquí >>
Espero eso ayude.
fuente