PHP 8.5 incorpora una extensión URI a su biblioteca estándar. Incluye las clases inmutables Uri\Rfc3986\Uri y Uri\WhatWg\Url, sin necesidad de instalar paquetes adicionales. La implementación de RFC 3986 utiliza uriparser. La implementación WHATWG reutiliza el motor Lexbor, que también impulsa la API DOM de PHP 8.4.

uri-example.php
<?php
use Uri\Rfc3986\Uri;

$uri = new Uri('https://shop.example/catalog/electronics?page=2&brand=acme#reviews');

echo $uri->getScheme();
echo $uri->getHost();
echo $uri->getPath();
echo $uri->getQuery();
echo $uri->getFragment();

La extensión cubre varias limitaciones de parse_url(), disponible desde PHP 4. Esa función devuelve un array asociativo con claves que pueden variar según la entrada. No valida la URL ni incluye lógica de reconstrucción. Los datos malformados o no confiables pueden generar resultados inesperados. Las nuevas clases producen objetos tipados y validan los datos durante el análisis.

Las dos clases aplican estándares distintos. Uri\Rfc3986\Uri está pensada para la sintaxis URI general, incluidas las URN, los schemes personalizados y las referencias relativas. Uri\WhatWg\Url sigue el modelo WHATWG de los navegadores para los enlaces web. Sin una URL base, espera una URL absoluta. También relaciona las formas Unicode y ASCII de los nombres de host internacionalizados y puede generar una versión en Punycode mediante toAsciiString().

Una URN como urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6 corresponde al modelo RFC 3986. Una dirección como https://exämple.com/path?query=1 puede procesarse con la clase WHATWG. La API RFC ofrece componentes normalizados mediante getScheme(), getHost(), getPath(), getQuery() y getFragment(). También incluye accesores sin normalizar, como getRawUserInfo(), getRawUsername(), getRawHost() y getRawPath(). Ambas API exponen datos de autenticación. La clase WHATWG añade métodos como getAsciiHost() y getUsername().

Los constructores señalan las entradas inválidas mediante excepciones específicas. El modelo RFC 3986 puede lanzar Uri\UriException o Uri\InvalidUriException. El constructor WHATWG puede lanzar Uri\WhatWg\InvalidUrlException. Las funciones estáticas ofrecen una ruta sin excepciones. Uri\Rfc3986\Uri::parse() devuelve un objeto o null. Uri\WhatWg\Url::parse() también puede rellenar un array errors con objetos UrlValidationError. Esto permite revisar los motivos del fallo, por ejemplo al validar datos enviados desde un formulario.

Las dos clases utilizan una API inmutable. Métodos como withScheme(), withPath(), withQuery(), withPort() y withFragment() devuelven un objeto nuevo y conservan el original. La serialización se realiza con toString(), toRawString() o toAsciiString(). Uri\WhatWg\Url::equals() y el método equivalente de RFC 3986 comparan valores URI normalizados. UriComparisonMode::IncludeFragment permite decidir si el fragmento participa en la comparación.

PHP recomienda estas clases para el código nuevo y para las migraciones que no necesiten conservar el comportamiento de parse_url(). Validar una URL con un analizador y recuperarla después con otro puede introducir riesgos de seguridad. La extensión URI ofrece a las aplicaciones PHP una base común para analizar, validar, comparar y modificar URI conforme a estándares definidos.