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武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。
辽宁义县春节期间文旅活动大戏连台庙趣横生金虎辞旧岁,玉兔迎新春。为了营造浓厚新春氛围,促进县域经济回暖升温,打造冬季旅游新亮点。辽宁义县在春节期间精细策划了义县民俗文化节暨冰雪旅游季活动,小年这天作为本次活动的重头戏义县
新春山海大巡游!来深圳东部华侨城欢喜过大年近日,记者从东部华侨城景区获悉,2023年春节东部华侨城景区推出山海迎新春,兔beNo。1主题活动,经典IP流氓兔来袭,在东部华侨城开启一段潮玩的奇妙旅途。大侠谷景区换新颜,红红火
九寨沟,原来你的名字是这样来的,真有意思!有一首耳熟能详的赞叹九寨沟美景的歌是这样唱的噢神奇的九寨,人间的天堂,你把那童话的世界,铺满高原,你看那天下的人儿噢,深情向往。关于九寨沟这个名字的由来,有一个美丽的传说相传在很久
丘福燕王第一将,靖难第一功,朱棣不杀功臣,为何将他毁家夺爵1402年9月,明成祖朱棣已经登基3个月,准备对靖难之役中的功臣论功行赏,朱能张武郑亨徐忠这些武将全部围在御前,纷纷讲述自己的功劳,生怕朱棣会忘记他们的贡献。然而,此时有一个人,默
圆明园寻迹站在失落的大水法面前,几乎没有人可以坦然面对它所映射的那段侵略史。伤怀之余我们不禁假设,如果没有1860年与1900年两次骇世的劫烧事件,集万园精髓于一身,融皇家琳琅于一体的圆明园
明朝最怎悲惨一的皇帝明光宗朱常洛到底有多惨?末代皇帝都处在困难时期,大都遭遇意外,尤其是年纪轻轻就不知道如何继承皇位的皇帝。然而,在明朝的历史上,有一位皇帝的下场非常悲惨。他的苦难不是朝廷的没落和外人的折磨,而是皇室造就了他
鳌拜从忠臣到权臣,他是康熙立威的牺牲品1642年,皇太极帝去世。崇政殿内,皇长子豪格跟睿亲王多尔衮,还在继续着激烈的的皇位之争。突然,拥有最多支持者的豪格,从大殿内疾步而出。他放弃了皇位的继承权。一时间,所有人都懵了。
曹操杀死杨修后,笑问其父杨彪怎么瘦了?杨彪一语已成千古名言杨修之死算的上是三国名场面,杨修死的原因可谓是众说纷纭,有人说是曹操失误所杀,可依我看,这是一个必然事件。有史料记载,杨修死后,曹操曾问他的父亲杨彪怎么瘦了。其中的感情或许是嘲讽也
宰相刘罗锅刘墉简介创作灵感历史我在头搞创作刘墉(17191804),字崇如,号石庵,还有另外青原香岩东武穆庵溟华日观峰道长等字体大小,清朝书法家思想家。山东高密县逄戈庄人(原属诸城市),籍贯江苏徐州
楚汉之争,两军大战于汉中,刘邦为何能在汉中之战中一举击败项羽公元前年,华夏大地上爆发了以陈胜吴广领导的秦末农民大起义,这次起义给了摇摇欲坠的秦王朝最后一击,彻底推翻了秦王朝的残暴统治。农民起义的锋火呈星火燎原之势,在各地蔓延,全国范围内出现
孟小冬是如何和杜月笙走到一起的?话说我的读者私下给我留言,问我是否可以发表一些野史传奇类的文章。其实本平台一开始的定位,就是文学(包括民间故事)文化和历史基础上,探讨一些其他雅俗共赏的内容。因此,也是传奇类内容当
国庆宝妈带宝宝去哪儿玩?来听听这位宝妈的心声单身时,一个人想去哪就去哪,随时都能来一场说走就走的旅行,背着小包去哪儿都可以。结婚后,两个人想去的地方多了,出去玩也有伴了,但是出去玩的心却没有了,只想宅在家里,过两人世界。两人
如何预防宝宝的高原红很多小宝宝,出生没多久,小脸蛋不是红红的就是长湿疹,其主要原因还是小宝宝的皮肤太嫩了,皮肤不能适应外界的温差,风吹等因素。那么小Baby的红脸蛋要怎么护肤呢?1保持皮肤清洁干爽,选
窗边的小豆豆这本书在之前给孩子买绘本的过程中,无数次看到有人推荐,但顾虑着它是一本纯文字性的书籍,孩子还暂时没法接受,所以一直添加着收藏,未曾购买。受单位上一位同事的馈赠,偶然得到了这本书,受
宝宝都爱投降睡,别强行把胳膊塞被窝了,这5种姿势才须纠正自从有了娃,我们永远将孩子的安全和健康放在第一位。新手爸妈面对新生宝宝,心里更是像绷着一根弦,唯恐自己哪里照顾不周,导致宝宝成长出现问题。即便宝宝睡着了,我们的警惕心依然不减。大家
Heaven成为了北美Y2K社交名片?1984年,仍在帕森斯就读的MarcJacobs,开设店铺JacobsDuffyDesigns,发售一些与当时纽约格格不入的设计,摇滚T恤廉价手袋,浮夸饰品当时还未被定义的街头艺术
英女王时尚穿搭大有玄机,尽显社交智慧!谁能想到手袋用来打暗号英女王时尚造型一路潮到老,穿搭大有玄机,谁能想到黑手袋是用来给手下打暗号的呢?红橙黄绿蓝腚紫,七彩色卡穿上身,她的服饰色彩缤纷又不失优雅,但有些颜色一定不上身,比如,卡其色,也谢绝
周末在家给孩子和家人做的大餐我和先生平时工作比较繁忙,单位都有食堂,周一到周五,我们都不在家里开火做饭,所以周末放假在家就想给孩子做顿丰富的大餐犒劳犒劳他们的胃,也让孩子从小就知道家的记忆是什么?妈妈的味道是
湖人众将状态良好,首次训练赛大放异彩北京时间2022年9月28日,湖人队开始了他们的第一次训练赛。队内赛打的可是充满能量,各种暴扣,稳稳地三分,展现自己天赋的同时,也给队友带来了获胜的信心。最亮眼的莫过于勒布朗詹姆斯
世事只求半称心世事无常生活颠簸,哪有那么多的风花雪月夹杂其中,人生一世生命一场,世事只求半称心即可,何须过多在意今后的岁月模样。其实这人世间种种不顺心和不如意都是真实的人生状态,努力做好自己该做
亚坤夜读丨秋村(有声)(节选)蔬菜地里的辣椒,火红火红的一大片,有闻名遐迩的鸡肠子辣椒光皮辣椒,也有最普通的小线椒小圆椒,熟透的辣椒。远远望去,像卷地的云霞,像跳跃的焰火,成为村庄初秋独特而美丽的风景。
秋风劲草互相知秋风劲草互相知文张清明(萧月月)秋风劲草互相知,天地绽放淅沥声。一点一泡泥沙溅,季节早已预先喷。吾坐窗前数雨落,惊诧其中浩瀚吞。寄生地球福人类,希望永怀真感恩。不畏恶浊遮望日,早雨