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).
- uriparser (para RFC 3986).
- Lexbor (para WHATWG).
- Validación estricta (parse() estático, excepciones como InvalidUrlException).
- Resolución de referencias relativas.
- Manejo seguro de URLs malformadas o con caracteres especiales.
- 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');
$url = new Url('https://example.com');