ulthonuri简单又优雅地解析URL
一个能够简单地解析和操作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的参数。
但仅仅是这样做是不够的,我们还要再封装一个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参数的事情,要写的东西却太多了。新的操作
但是有这样一个简单却实用的库,能够让这些操作变得非常简单,像下面这样:<?php use UlthonURIURI; 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(); }
是的,就这么简单,还可以使用链式操作,让代码更精简:<?php use UlthonURIURI; 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 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();
支持的方法如下:scheme()user()pass()host()port()path()query()fragment()
如果传入参数,就是设置,否则只是读取。比如我们要读取域名: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"]["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武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。