He estado buscando una expresión regular simple para las URL, ¿alguien tiene una práctica que funcione bien? No encontré uno con las clases de validación de Zend Framework y he visto varias implementaciones.
php
regex
url
validation
AndreLiem
fuente
fuente
Respuestas:
Utilicé esto en algunos proyectos, no creo que haya tenido problemas, pero estoy seguro de que no es exhaustivo:
La mayor parte de la basura aleatoria al final es para lidiar con situaciones como
http://domain.com.
en una oración (para evitar coincidir con el período final). Estoy seguro de que podría limpiarse, pero ya que funcionó. Lo he copiado más o menos de un proyecto a otro.fuente
google.com
es solo una ruta URL relativa válida pero no una URL absoluta válida. Y creo que eso es lo que está buscando.http://example.com/somedir/...
es una URL perfectamente legítima, que solicita el archivo llamado...
, que es un nombre de archivo legítimo.http://www.example
que es válidoUse la
filter_var()
función para validar si una cadena es URL o no:Es una mala práctica usar expresiones regulares cuando no es necesario.
EDITAR : Tenga cuidado, esta solución no es segura para Unicode y no es segura para XSS. Si necesita una validación compleja, tal vez sea mejor buscar en otro lugar.
fuente
http://www
Según el manual de PHP, parse_url no debe usarse para validar una URL.
Desafortunadamente, parece que
filter_var('example.com', FILTER_VALIDATE_URL)
no funciona mejor.Ambos
parse_url()
yfilter_var()
pasarán URL con formato incorrecto comohttp://...
Por lo tanto, en este caso, regex es el mejor método.
fuente
En caso de que quieras saber si la url realmente existe:
fuente
$url
antes de verificar que la url es real porque la operación anterior es costosa, tal vez hasta 200 milisegundos dependiendo del tamaño del archivo. En algunos casos, la URL puede no tener un recurso disponible en su ubicación todavía (por ejemplo, crear una URL para una imagen que aún no se ha cargado). Además, no está utilizando una versión en caché, por lo que no es asífile_exists()
que almacenará en caché una estadística en un archivo y volverá casi instantáneamente. Sin embargo, la solución que proporcionó sigue siendo útil. ¿Por qué no solo usarfopen($url, 'r')
?Según John Gruber (Daring Fireball):
Expresión regular:
utilizando en preg_match ():
Aquí está el patrón extendido de expresiones regulares (con comentarios):
Para obtener más detalles, consulte: http://daringfireball.net/2010/07/improved_regex_for_matching_urls
fuente
No creo que usar expresiones regulares sea algo inteligente en este caso. Es imposible igualar todas las posibilidades e incluso si lo hiciera, todavía existe la posibilidad de que la url simplemente no exista.
Aquí hay una manera muy simple de probar si la URL realmente existe y es legible:
(si no existe
preg_match
, esto también validaría todos los nombres de archivo en su servidor)fuente
He usado este con mucho éxito, no recuerdo de dónde lo obtuve
fuente
fuente
Y ahí está tu respuesta =) ¡Intenta romperlo, no puedes!
fuente
Editar:
Como la incidencia señaló, este código ha sido DEPRECADO con el lanzamiento de PHP 5.3.0 (2009-06-30) y debe usarse en consecuencia.
Solo mis dos centavos, pero he desarrollado esta función y la he estado usando durante un tiempo con éxito. Está bien documentado y separado para que pueda cambiarlo fácilmente.
fuente
fuente
Inspirado en esta pregunta de .NET StackOverflow y en este artículo referenciado de esa pregunta, existe este validador de URI (URI significa que valida tanto la URL como la URN).
He probado con éxito esta función dentro de un ValueObject que nombré
Uri
y probéUriTest
.UriTest.php (contiene casos válidos e inválidos para URL y URN)
Uri.php (Objeto de valor)
Ejecución de pruebas de unidad
Hay 65 afirmaciones en 46 pruebas. Precaución: hay 2 proveedores de datos para expresiones válidas y 2 más para expresiones no válidas. Uno es para URL y el otro para URN. Si está utilizando una versión de PhpUnit de v5.6 * o anterior, entonces necesita unir los dos proveedores de datos en uno solo.
Cobertura de código
Hay un 100% de cobertura de código en este verificador de URI de muestra.
fuente
(http (s?): //) significa http: // o https: //
([a-z0-9 -] +.) + => 2.0 [a-z0-9-] significa cualquier carácter az o cualquier signo 0-9 o (-))
"/(http(s?)://)([a-z0-9-font>+.)+[azfont>{2,4}(.[azfont>{2,4}) (/ [^] + ) / i "
Nota: Perdón por el mal inglés. Mi país no lo usa bien.
fuente
Bien, esto es un poco más complejo que una simple expresión regular, pero permite diferentes tipos de URL.
Ejemplos:
Todo lo cual debe ser marcado como válido.
Tenga en cuenta que hay una verificación en matriz para los protocolos que desea permitir (actualmente solo http y https están en esa lista).
fuente
La mejor URL Regex que funcionó para mí:
Ejemplos:
Fuente: http://urlregex.com/
fuente
Peter Regex no me parece correcto por muchas razones. Permite todo tipo de caracteres especiales en el nombre de dominio y no prueba mucho.
La función de Frankie me parece buena y puedes construir una buena expresión regular de los componentes si no quieres una función, así:
No probado pero creo que debería funcionar.
Además, la respuesta de Owen tampoco parece 100%. Tomé la parte de dominio de la expresión regular y la probé en una herramienta de prueba Regex http://erik.eae.net/playground/regexp/regexp.html
Puse la siguiente línea:
en la sección "regexp" y la siguiente línea:
en la sección "texto de muestra".
El resultado permitió el carácter negativo a través. Porque \ S significa cualquier carácter no espacial.
Tenga en cuenta que la expresión regular de Frankie maneja el signo menos porque tiene esta parte para el primer personaje:
Lo que no permitirá el signo menos ni ningún otro carácter especial.
fuente
Aquí está la forma en que lo hice. Pero quiero decir que no soy tan seguro acerca de la expresión regular. Pero debería funcionar tú :)
De esta manera no necesitará el marcador eval en su patrón.
Espero eso ayude :)
fuente
Aquí hay una clase simple para la Validación de URL usando RegEx y luego hace referencias cruzadas del dominio contra servidores RBL (Listas de agujeros negros en tiempo real) populares:
Instalar en pc:
Uso:
Agregue una URL como parámetro del
domain()
método y verifique la devolución.Salida:
Como puede ver arriba, www.bokranzr.com aparece como sitio web malicioso a través de un RBL, por lo que el dominio se devolvió como falso.
fuente
Para cualquiera que desarrolle con WordPress, simplemente use
para validar una URL ( aquí está la documentación de WordPress
esc_url_raw
). Maneja las URL mucho mejor quefilter_var($url, FILTER_VALIDATE_URL)
porque es unicode y seguro para XSS. ( Aquí hay un buen artículo que menciona todos los problemas confilter_var
).fuente
He encontrado que esto es lo más útil para hacer coincidir una URL.
fuente
ftp:
?Hay una función nativa de PHP para eso:
Devuelve los datos filtrados, o FALSE si el filtro falla.
Compruébalo aquí
fuente