一个能够简单地解析和操作URL的类库。
开发中,我们会经常处理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的参数。
但仅仅是这样做是不够的,我们还要再封装一个用于把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,要处理很多边界情况,比如:
总之一个小小的替换url的get参数的事情,要写的东西却太多了。
新的操作
但是有这样一个简单却实用的库什么是url,能够让这些操作变得非常简单,像下面这样:
set('lang',$lang);
return $url->url();
}
是的,就这么简单,还可以使用链式操作,让代码更精简:
set('lang',$lang)->url()
}
使用文档
最低支持php7.2,通过安装:
composer require ulthon/uri
基本的使用方式如下,通过make静态方法或手动实例化:
use UlthonURIURI;
$url = 'https://phpreturn.com/index/a6310ae8e7c561.html?name=john&emailjohn@smith.com#fragment';
$uri = URI::make($url);
// 或者
$uri = new URI($url);
实例化完成之后,就可以使用类库方法随心所欲的操作URL。
比如设置协议或域名:
use UlthonURIURI;
$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();
支持的方法如下:
如果传入参数,就是设置,否则只是读取。比如我们要读取域名:
use UlthonURIURI;
$url = 'http://phpreturn.com?name=john&emailjohn@smith.com';
$domain = URI::make($url)
->domain();
他还支持更复杂的用法,比如解析相对路径:
use UlthonURIURI;
$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']['']['html'] ,这时只需要使用post..html即可获取。
query的操作有这些:
其中方法支持通过回调函数方式:
$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();
这样一个库,很简单,却很好用,提升开发幸福感。
原文标题:[/uri]简单又优雅的解析URL
限时特惠:本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情
站长微信:Jiucxh
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。