开拓中,我们会常常处理URL,在以前我们会向下面这样做:

比如我们希望做一个在链接中增加lang参数的处理,可能会封装这样一个函数:

function switch_lang_url($lang){ $url = Request::url(); // 解析URL $url_info = parse_url($url); $query = []; // 获取query,但有时不存在这个元素 if (isset($url_info['query'])) { parse_str($url_info['query'], $query); } // 设置lang参数 $query['lang'] = $lang; // 把新的query设置数组重新天生query $url_info['query'] = http_build_query($query); // 把url的设置重新天生url return unparse_url($url_info);}

在上面我们可以看到,我们希望得到url中的lang参数,返回新的带有lang的参数。

phpurl解析ulthon/uri简略又优雅地解析URL HTML

但仅仅是这样做是不足的,我们还要再封装一个unparse_url用于把url的解析结果编码成url。

function unparse_url($parsed_url){ $scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : ''; $host = isset($parsed_url['host']) ? $parsed_url['host'] : ''; $port = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : ''; $user = isset($parsed_url['user']) ? $parsed_url['user'] : ''; $pass = isset($parsed_url['pass']) ? ':' . $parsed_url['pass'] : ''; $pass = ($user || $pass) ? "$pass@" : ''; $path = isset($parsed_url['path']) ? $parsed_url['path'] : ''; $query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : ''; $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : ''; return "$scheme$user$pass$host$port$path$query$fragment";}

这样一通操作下来,虽然代码总体不繁芜,但是写起来很不顺手,要处理很多边界情形,比如:

解析完url之后还要判断query参数是否存在再把字符串的query转成我们须要的数组设置完query数组还要再转回去末了还要依赖一个外部参数天生终极的url

总之一个小小的更换url的get参数的事情,要写的东西却太多了。

新的操作

但是有这样一个大略却实用的库,能够让这些操作变得非常大略,像下面这样:

<?phpuse Ulthon\URI\URI;function switch_lang_url($lang){ $url = 'https://phpreturn.com/index/a6310ae8e7c561.html?name=john&emailjohn@smith.com#fragment'; $uri = URI::make($url); $url->set('lang',$lang); return $url->url();}

是的,就这么大略,还可以利用链式操作,让代码更精简:

<?phpuse Ulthon\URI\URI;function switch_lang_url($lang){ $url = 'https://phpreturn.com/index/a6310ae8e7c561.html?name=john&emailjohn@smith.com#fragment'; return URI::make($url)->set('lang',$lang)->url()}利用文档

最低支持php7.2,通过composer安装:

composer require ulthon/uri

基本的利用办法如下,通过make静态方法或手动实例化:

use Ulthon\URI\URI;$url = 'https://phpreturn.com/index/a6310ae8e7c561.html?name=john&emailjohn@smith.com#fragment';$uri = URI::make($url);// 或者$uri = new URI($url);

实例化完成之后,就可以利用类库方法为所欲为的操作URL。

比如设置协议或域名:

use Ulthon\URI\URI;$url = 'phpreturn.com?name=john&emailjohn@smith.com';$newUrl = URI::make($url) ->scheme('http') // 修正链接为: http://phpreturn.com/index/a6310ae8e7c561.html?name=john&emailjohn@smith.com ->domain('doc.ulthon.com') // 修正链接为: http://doc.ulthon.com/index/a6310ae8e7c561.html?name=john&emailjohn@smith.com ->url();

支持的方法如下:

scheme()user()pass()host()port()path()query()fragment()

如果传入参数,便是设置,否则只是读取。
比如我们要读取域名:

use Ulthon\URI\URI;$url = 'http://phpreturn.com?name=john&emailjohn@smith.com';$domain = URI::make($url) ->domain();

他还支持更繁芜的用法,比如解析相对路径:

use Ulthon\URI\URI;$url = 'http://phpreturn.com/dir/sub/file.php?name=john&emailjohn@smith.com';$relativeUrl = '../../hello.php';$newUrl = URI::make($url) ->relative($relativeUrl) // 链接修正为: http://phpreturn.com/hello.php?name=john&emailjohn@smith.com ->url();

在设置和获取query时,支持通过点分隔符读取多级数组,比如想要获取这样的值$_GET['post']['content']['html'] ,这时只须要利用post.content.html即可获取。

query的操作有这些:

add() 添加get参数remove() 删除get参数set() 设置get参数get() 读取get参数

个中remove方法支持通过回调函数办法:

$url = 'https://phpreturn.com/?utm_source=summer-mailer&utm_medium=email&utm_campaign=summer-sale';$newUrl = URI::make($url)->remove(function ($key, $value) { return (bool)preg_match('#^utm_#si', $key);})->url();

这样一个库,很大略,却很好用,提升开拓幸福感。

原文标题:[ulthon/uri]大略又优雅的解析URL

原文地址:https://phpreturn.com/index/a6353461657301.html

原文平台:PHP武器库

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站许可任何形式的转载/引用文章,但必须同时注明出处。