[ulthon/uri]简单又优雅的解析URL

2022-10-22 奥古斯宏
一个能够简单地解析和操作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参数的事情,要写的东西却太多了。

新的操作

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

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

<?php
use 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();
}

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

<?php
use FilippoToso\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();  

支持的方法如下:

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

  • 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();

这样一个库,很简单,却很好用,提升开发幸福感。

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

最近浏览
IP用户:44.222.*.*
2 小时前 ccBot crawler
IP用户:185.191.*.*
5 小时前 Semrush Bot
IP用户:175.155.*.*
2 天前 Internet Explorer Windows 7
IP用户:218.5.*.*
3 天前 Cheetah Browser Windows 7
IP用户:112.114.*.*
3 天前 Chrome Windows 10
IP用户:101.67.*.*
5 天前 Generic Bot
IP用户:180.105.*.*
5 天前 UBrowser Windows 10
IP用户:125.123.*.*
7 天前 Internet Explorer Windows 7
IP用户:54.36.*.*
10 天前 aHrefs Bot
IP用户:52.230.*.*
11 天前 GPTBot
IP用户:52.230.*.*
11 天前 GPTBot
IP用户:220.181.*.*
12 天前 Baidu Spider
累计浏览次数:1135
评论
点击登录
phpreturn,PHP武器库,专注PHP领域的项目和资讯,收录和介绍PHP相关项目。
最近浏览 点击登录
累计浏览次数:128701
一周浏览次数:2408
今日浏览次数:129

本站所有权利归 phpreturn.com 所有

举报/反馈/投稿邮箱:phpreturn@ulthon.com

鲁ICP备19027671号-2