2012-03-21 12 views
18

En PHP, filter_var('www.example.com', FILTER_VALIDATE_URL) devuelve false. ¿Es esto correcto? ¿No es www.example.com una URL válida, o los protocolos (http: //, ftp: //, etc.) deben declararse explícitamente en la URL para que sean formalmente correctos?¿FILTER_VALIDATE_URL es demasiado estricto?

Respuesta

22

No es una URL válida. Prefijo cosas con http:// nunca fue una cosa fácil de usar, por lo que los navegadores modernos suponen que quieres decir http si solo ingresas un nombre de dominio. ¡Las bibliotecas de software son, con razón, un poco más exigentes!

Un enfoque que podría tomar es pasar la cuerda a través de parse_url y agregar los elementos que falten, p.

if ($parts = parse_url($url)) { 
    if (!isset($parts["scheme"])) 
    { 
     $url = "http://$url"; 
    } 
} 

Curiosamente, cuando se utiliza FILTER_VALIDATE_URL, en realidad se utiliza parse_url internamente para averiguar lo que el esquema es (view source). Gracias a salathe por detectar esto en los comentarios a continuación.

+0

¡Gracias por la explicación! Usaré el enfoque 'parse_url' que dijiste, me gusta mejor que' filter_var' – federicot

+3

Wednesday Trivia: 'FILTER_VALIDATE_URL' usa' parse_url() 'para verificar si hay un esquema. – salathe

+0

¡Agradable! ¡Lo agregaré a la respuesta! –

3

La URL debe corresponderse con las reglas establecidas en RFC 2396, y según esa especificación, el protocolo es necesario.

1

La parte del esquema ("protocolo") es necesaria para FILTER_VALIDATE_URL.

3

Además de la respuesta de Paul Dixon, quiero decir que puede usar flags para FILTER_VALIDATE_URL para especificar qué parte de la URL debe presentarse.

FILTER_FLAG_SCHEME_REQUIRED 
FILTER_FLAG_HOST_REQUIRED 
FILTER_FLAG_PATH_REQUIRED 
FILTER_FLAG_QUERY_REQUIRED 

a partir de PHP 5.2.1 FILTER_FLAG_SCHEME_REQUIREDFILTER_FLAG_HOST_REQUIRED y banderas utilizadas por defecto y, por desgracia, no hay manera de desactivar (que puede no hacer algo como filter_var($url, FILTER_VALIDATE_URL, ~FILTER_FLAG_SCHEME_REQUIRED); si la existencia de la parte esquema de URL hace no necesariamente). Parece un error para mí. Hay un relativo bugreport.

+0

Ojalá hubiera funcionado, pero no puedo hacerlo. –

+1

Esto parece hacer que no valide ninguna URL. https://3v4l.org/1TjA5 – Derokorian

+0

@RussellSilva, Derokorian Tienes razón, no puedo hacer que funcione. Parece un error para mí. Actualicé mi respuesta. –