parse_url
(PHP 4, PHP 5, PHP 7, PHP 8)
parse_url — Analiza una URL y devuelve sus componentes
Descripción
Esta función no está
diseñada para validar la URL proporcionada, solo la divide en las partes enumeradas
a continuación. Las URL parciales e inválidas también son aceptadas, la función
parse_url() hará todo lo posible para analizarlas correctamente.
Precaución
Esta función no sigue ningún estándar URI o URL establecido.
Devolverá resultados incorrectos o sin sentido para URL relativas o
malformadas. Incluso para URL válidas, el resultado puede diferir del de
otro analizador de URL, ya que existen múltiples estándares diferentes
relacionados con las URL que se dirigen a diferentes casos de uso y que
difieren en sus requisitos.
El procesamiento de una URL con analizadores que siguen diferentes estándares
de URL es una fuente común de vulnerabilidades de seguridad. Por ejemplo,
la validación de una URL contra una lista de nombres de host permitidos con
el analizador A podría ser ineficaz cuando la recuperación real del recurso
utiliza el analizador B que extrae los nombres de host de manera diferente.
Las clases Uri\Rfc3986\Uri y Uri\WhatWg\Url
siguen estrictamente los estándares RFC 3986 y WHATWG URL respectivamente.
Se recomienda encarecidamente utilizar estas clases para todo el código nuevo
y migrar los usos existentes de la función parse_url()
a estas clases, a menos que el comportamiento de parse_url()
deba preservarse por razones de compatibilidad.
Valores devueltos
Para URL realmente mal formadas, parse_url() puede devolver
false.
Si el parámetro component se omite, se devuelve un array
asociativo. Al menos un elemento estará presente en el array. Estas
son las claves potenciales de este array:
-
scheme - por ejemplo
http
-
host
-
port
-
user
-
pass
-
path
-
query - después del signo de interrogación "
?"
-
fragment - después del símbolo de almohadilla "
#"
Si el parámetro component está especificado, parse_url()
devuelve un string (o un int, en el caso de
PHP_URL_PORT) en lugar de un array. Si el componente
solicitado no existe en la URL, null será devuelto.
A partir de PHP 8.0.0, parse_url() distingue entre los
fragmentos y consultas ausentes y vacíos:
Anteriormente todos los casos resultaban en la consulta y el fragmento siendo null.
Cabe señalar que los caracteres de control (ver ctype_cntrl())
en los componentes son reemplazados por un guion bajo
(_).
Ejemplos
Ejemplo #1 Ejemplo con parse_url()
<?php
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';
var_dump(parse_url($url));
var_dump(parse_url($url, PHP_URL_SCHEME));
var_dump(parse_url($url, PHP_URL_USER));
var_dump(parse_url($url, PHP_URL_PASS));
var_dump(parse_url($url, PHP_URL_HOST));
var_dump(parse_url($url, PHP_URL_PORT));
var_dump(parse_url($url, PHP_URL_PATH));
var_dump(parse_url($url, PHP_URL_QUERY));
var_dump(parse_url($url, PHP_URL_FRAGMENT));
?>
El ejemplo anterior mostrará:
array(8) {
["scheme"]=>
string(4) "http"
["host"]=>
string(8) "hostname"
["port"]=>
int(9090)
["user"]=>
string(8) "username"
["pass"]=>
string(8) "password"
["path"]=>
string(5) "/path"
["query"]=>
string(9) "arg=value"
["fragment"]=>
string(6) "anchor"
}
string(4) "http"
string(8) "username"
string(8) "password"
string(8) "hostname"
int(9090)
string(5) "/path"
string(9) "arg=value"
string(6) "anchor"
Ejemplo #2 Ejemplo con la función parse_url() sin esquema
<?php
$url = '//www.example.com/path?googleguy=googley';
// Antes de PHP 5.4.7, la ruta sería "//www.example.com/path"
var_dump(parse_url($url));
?>
El ejemplo anterior mostrará:
array(3) {
["host"]=>
string(15) "www.example.com"
["path"]=>
string(5) "/path"
["query"]=>
string(17) "googleguy=googley"
}
Notas
Nota:
parse_url() fue creada específicamente para analizar URL
y no URI. Sin embargo, por razones de compatibilidad adyacente, PHP
hace una excepción para el esquema file:// donde los triples slashs
(file:///...) están permitidos. Todos los demás esquemas son inválidos.