parse_url

(PHP 4, PHP 5, PHP 7, PHP 8)

parse_urlAnaliza una URL y devuelve sus componentes

Descripción

parse_url(string $url, int $component = -1): int|string|array|null|false

Esta función analiza una URL y devuelve un array asociativo que contiene todos los elementos presentes en la misma. Los valores de los elementos del array NO ESTÁN decodificados de la URL.

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 puede no proporcionar resultados correctos para URL relativas o inválidas y los resultados pueden no coincidir con el comportamiento estándar de los clientes HTTP. Si se deben analizar URL provenientes de la entrada del usuario, se requieren verificaciones adicionales, por ejemplo utilizando filter_var() con el filtro FILTER_VALIDATE_URL.

Parámetros

url

La URL a analizar.

component

Puede ser una de las constantes entre PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY o PHP_URL_FRAGMENT para recuperar únicamente una parte de la URL como string (excepto cuando se proporciona PHP_URL_PORT; en este caso, el valor devuelto será un entier).

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 entier en el caso de uso de la constante 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:

http://example.com/foo → query = null, fragment = null
http://example.com/foo? → query = "",   fragment = null
http://example.com/foo# → query = null, fragment = ""
http://example.com/foo?# → query = "",   fragment = ""

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 (_).

Historial de cambios

Versión Descripción
8.0.0 parse_url() distingue ahora entre los fragmentos y consultas ausentes y vacíos.

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 resultado del ejemplo sería:

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 resultado del ejemplo sería:

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.

Ver también