2011-08-09 36 views

Respuesta

44

¡Sí, hay! Utilice filter_var:

if (filter_var($url, FILTER_VALIDATE_URL) !== false) ... 

FILTER_VALIDATE_URL valida URL acuerdo con RFC 2396.

+15

FILTER_VALIDATE_URL no es confiable y no puede validar URL basadas en direcciones IPv6 . Me tropecé con esto mientras buscaba SO para cualquier pregunta sobre validación de URL PHP que no lo utilizo, porque me pareció bastante inútil. – GordonM

+3

esto se interpreta como una URL válida, mostrando correctamente la cookie: 'echo filter_var ('http://example.com/">', FILTER_VALIDATE_URL); 'Tenga cuidado con' filter_var() ; 'en 5.4 –

+0

En relación con el comentario de GordonM, eche un vistazo a la siguiente esencia, para ver un ejemplo de cómo el FILTER_VALIDATE_URL de PHP probablemente no funciona como podría esperarlo: https://gist.github.com/anonymous/10967187 – coatesap

0

Depende de su definición de válido. Semánticamente válido, el nombre de dominio se resuelve, etc.

El enfoque rápido sería usar preg_match para probar la URL contra una buena expresión regular para validar que tiene el formato correcto. Parece que hay algunos buenos ejemplos en este hilo PHP validation/regex for URL

+0

Con "válido" quiero decir, si tiene http: // y termina con .EXT –

+4

@Oliver: Observe la URL para esta pregunta. Esa no es una URL válida según su definición. –

+1

Entonces una preg_match contra una buena expresión regular o filter_var http://www.php.net/manual/en/filter.filters.validate.php es su mejor apuesta. Si utiliza la ruta de expresión regular, asegúrese de obtener una buena que cubra todos los casos de uso válidos (http: // https: // FQDN o no, etc.) –

12

Bueno, si nos fijamos en RFC 3986 podemos encontrar la definición de una URL.

Y si echamos un vistazo a el Apéndice B hay una guía para el uso de expresiones regulares para analizar una dirección URL:

Apéndice B. Analizar una referencia URI con una expresión regular

A medida que el " primero-partido-gana" algoritmo es idéntico al '
método de desambiguación codiciosos' utilizado por las expresiones regulares POSIX, es
natural y corriente utilizar una expresión regular para analizar las posibles
cinco componentes de una referencia URI erence.

La siguiente línea es la expresión regular para descomponer una referencia de URI bien formada
en sus componentes.

^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))? 
    12   3 4   5  6 7  8 9 

Los números en la segunda línea de arriba son sólo para ayudar legibilidad; indican los puntos de referencia para cada subexpresión (es decir, cada paréntesis emparejado). Nos referimos al valor que coincide con la subexpresión como $. Por ejemplo, a juego la expresión anterior para

http://www.ics.uci.edu/pub/ietf/uri/#Related 

resultados en las siguientes coincidencias subexpresión:

$1 = http: 
    $2 = http 
    $3 = //www.ics.uci.edu 
    $4 = www.ics.uci.edu 
    $5 = /pub/ietf/uri/ 
    $6 = <undefined> 
    $7 = <undefined> 
    $8 = #Related 
    $9 = Related 

donde indica que el componente no está presente, como es el caso para el componente de consulta en el ejemplo anterior. Por lo tanto, podemos determinar el valor de los cinco componentes como

scheme = $2 
    authority = $4 
    path  = $5 
    query  = $7 
    fragment = $9 

va en la dirección opuesta, podemos recrear una referencia URI partir de sus componentes utilizando el algoritmo de la Sección 5.3.

Puede ues esta expresión regular para analizar la URL de forma manual o utilizar el construido en parse_url function avalable en PHP 4 y 5