URL
composer require php-standard-library/url
The URL component provides a strict URL type that guarantees a scheme and authority are always present. It builds on top of the URI and IRI packages, adding validation and default port stripping.
Parsing
Parse a URL string with strict validation; scheme and authority are required:
use Psl\IO;
use Psl\URL;
$url = URL\parse('https://example.com:443/path?q=1#frag');
// "https"
IO\write_line('%s', $url->scheme);
// "example.com"
IO\write_line('%s', $url->authority->host->toString());
// null - default port stripped
IO\write_line('%s', $url->authority->port === null ? 'null' : (string) $url->authority->port);
// "/path"
IO\write_line('%s', $url->path);
// "q=1"
IO\write_line('%s', $url->query ?? '<unknown>');
// "frag"
IO\write_line('%s', $url->fragment ?? '<unknown>');
// "https://example.com/path?q=1#frag"
IO\write_line('%s', $url->toString());
Default ports are automatically stripped for known schemes (HTTP 80, HTTPS 443, FTP 21, SSH 22, and many more).
From URI
Convert a parsed URI to a URL with validation:
use Psl\IO;
use Psl\URI;
use Psl\URL;
$uri = URI\parse('https://example.com/path');
$url = URL\from_uri($uri);
// "https://example.com/path"
IO\write_line('%s', $url->toString());
Throws InvalidURLException if the URI is missing a scheme, authority, or has a rootless path.
From IRI
Convert an internationalized IRI directly to a URL, applying Punycode encoding and percent-encoding in one step:
use Psl\IO;
use Psl\IRI;
use Psl\URL;
$iri = IRI\parse('https://münchen.de/straße');
$url = URL\from_iri($iri);
// "https://xn--mnchen-3ya.de/stra%C3%9Fe"
IO\write_line('%s', $url->toString());
Converting Back to URI
A URL can be converted back to a URI for use with the full URI API:
use Psl\IO;
use Psl\URL;
$url = URL\parse('https://example.com/path');
$uri = $url->toURI();
// "https://example.com/path"
IO\write_line('%s', $uri->toString());
See src/Psl/URL/ for the full API.