我想根据列表检查 URL 以做出有关处理的选择(这将查看数据流,而不是作为应用程序中的路由器)但是 HTTP 使得以多种不同方式表示相同的URL变得非常容易,例如(改编自RFC 2616):
http://example.com/~smith/home.html
http://example.com:80/~smith/home.html
http://EXAMPLE.com/%7Esmith/home.html
http://EXAMPLE.COM/%7esmith/home.html
Run Code Online (Sandbox Code Playgroud)
都代表相同的目标资源。
我希望能够将 URL 转换为规范形式...
有没有一种简单的方法可以始终如一地做到这一点?
(似乎这些parse_url()都没有。)
您可以使用glenscott/url-normalizer包进行符合规范 RFC 3986 的 URL 规范化。您可以通过以下简单示例的帮助查看规范化的结果:
$urls = [
'http://example.com/~smith/home.html',
'http://example.com:80/~smith/home.html',
'http://EXAMPLE.com/%7Esmith/home.html',
'http://EXAMPLE.COM/%7esmith/home.html',
'https://example.com:443/~smith/home.html'
];
foreach ($urls as $url) {
$normalizer = new URL\Normalizer($url);
echo $normalizer->normalize(), "</br>";
}
Run Code Online (Sandbox Code Playgroud)
结果:
http://example.com/~smith/home.html
http://example.com/~smith/home.html
http://example.com/~smith/home.html