EXTENSIÓN URI DE PHP: CÓMO TRABAJAR CON URLS

La extensión URI es una de las novedades más importantes de PHP 8.5. Es una extensión que no hace falta instalarla ni activarla en php.ini. Está integrada directamente en el núcleo de PHP.
Hasta PHP 8.4, la única forma nativa de trabajar con URLs era la función parse_url, que no cumplía completamente ningún estándar y podía dar resultados incorrectos o inseguros. Generando bugs, problemas de interoperabilidad y vulnerabilidades como “URL parsing confusion”. La extensión URI soluciona todo eso ofreciendo:
  • Parseo, validación, normalización y modificación de URIs/URLs conforme a estándares reales.
  • Dos implementaciones distintas según lo que necesites:RFC 3986 (el estándar clásico para URIs, más estricto y usado en servidores y APIs).
  • WHATWG URL (el estándar que siguen los navegadores web, más permisivo).
Está construida sobre bibliotecas probadas y seguras:
  • uriparser (para RFC 3986).
  • Lexbor (para WHATWG).
También soporta:
  • Validación estricta (parse() estático, excepciones como InvalidUrlException).
  • Resolución de referencias relativas.
  • Manejo seguro de URLs malformadas o con caracteres especiales.
Ventajas principales:
  • Objetos orientados a objetos (no arrays como parse_url()).
  • Inmutables y con interfaz fluida (with* methods).
  • Seguridad mejorada (evita confusiones de parsing).
  • Normalización automática según el estándar elegido.
  • Siempre disponible (no dependes de Composer ni de librerías externas como league/uri).

Ejemplos

Todo está en el namespace Uri\.

getScheme();     // "https"
echo $uri->getHost();  // "example.com"
echo $uri->getPort();  // 443
echo $uri->getPath();  // "/path"
echo $uri->getQuery(); // "query=value"
echo $uri->getFragment();   // "fragment"

// Reconstruir la URI (normalizada)
echo $uri->toString(); // "https://example.com/path?query=value#fragment"
echo $uri->toRawString();   // conserva el formato original

// Modificar (crea una NUEVA instancia, porque es inmutable)
$uri2 = $uri->withHost('otrodominio.com')
  ->withPath('/nueva/ruta')
  ->withQuery('a=1&b=2');
Para el estándar WHATWG (más cercano al comportamiento de Chrome/Firefox):

$url = new Url('https://example.com');