php - son - padres estrictos hijos rebeldes
¿FILTER_VALIDATE_URL es demasiado estricto? (4)
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
Desde PHP 5.2.1 FILTER_FLAG_SCHEME_REQUIRED
y FILTER_FLAG_HOST_REQUIRED
usan de forma predeterminada y, desafortunadamente, no hay forma de deshabilitarlos ( filter_var($url, FILTER_VALIDATE_URL, ~FILTER_FLAG_SCHEME_REQUIRED);
no necesariamente). Parece un error para mí. Hay un bugreport relativo.
En PHP, filter_var(''www.example.com'', FILTER_VALIDATE_URL)
devuelve false
. ¿Es esto correcto? ¿No es necesario que www.example.com
una URL válida o que los protocolos (http: //, ftp: //, etc.) estén explícitamente indicados en la URL para que sean formalmente correctos?
La URL debe corresponder con las reglas establecidas en RFC 2396 , y de acuerdo con esa especificación, el protocolo es necesario.
La parte del esquema ("protocolo") se requiere para FILTER_VALIDATE_URL
.
No es una URL válida. Prefijar cosas con http://
nunca fue algo fácil de usar, por lo que los navegadores modernos asumen 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 cadena a través de parse_url y luego agregar los elementos que faltan, por ejemplo,
if ( $parts = parse_url($url) ) {
if ( !isset($parts["scheme"]) )
{
$url = "http://$url";
}
}
Curiosamente, cuando usa FILTER_VALIDATE_URL, en realidad usa parse_url internamente para averiguar cuál es el esquema (ver fuente) . Gracias a Salathe por ver esto en los comentarios a continuación.