当前位置: 首页 > 后端技术 > PHP

学习PHP中URL相关的操作函数

时间:2023-03-29 20:43:09 PHP

在日常的业务开发过程中,我们经常会有处理URL链接的需求,所以今天学习的函数其实都是大家经常用到的一些函数。在之前的工作过程中,其实我对这些功能只有一个模糊的概念,我知道,但是当我真正需要使用它的时候,我仍然需要阅读文档来确定我真正想要使用的功能。所以,今天我们把它当作复习练习,主要是区分和搞清楚各个功能的真正用途。编码操作函数先看URL编码相关的函数。有些浏览器会在我们复制粘贴一个URL后自动对URL进行URL编码,也就是很多百分号的形式。在PHP中,自然有对应的编解码函数。$url="https://www.zyblog.net?opt=dev&mail=zyblog@net.net&comments=aaabbbccc%dfg&==*()cdg&value="中文也有中文符号!!"";echo$url,PHP_EOL;//https://www.zyblog.net?opt=dev&mail=zyblog@net.net&comments=aaabbbccc%dfg&==*()cdg&value="中文也可以,还有中文符号!!”$enurl=urlencode($url);echo$enurl,PHP_EOL;//https%3A%2F%2Fwww.zyblog.net%3Fopt%3Ddev%26mail%3Dzyblog%40net.net%26comments%3Daaa+bbb+ccc+%25dfg+%26%3D%3D%2A%28%29+cdg%26value%3D%E2%80%9C%E4%B8%AD%E6%96%87%E4%B9%9F%E6%9C%89%E5%91%80%EF%BC%8C%E8%BF%98%E6%9C%89%E4%B8%AD%E6%96%87%E7%AC%A6%E5%8F%B7%EF%BC%81%EF%BC%81%E2%80%9Dechourldecode($enurl),PHP_EOL;//https://www.zyblog.net?opt=dev&mail=zyblog@net.net&comments=aaabbbccc%dfg&==*()cdg&value="中文也可以,还有中文符号!!"这两个函数估计是用的最多的函数了。urlencode()用于URL的编码操作。可以看出,我们准备的链接已经被编码成包含各种百分号的内容。尤其是汉字,如果在GET方法中的链接中是中文参数,编码后的内容会使链接变得很长。urldecode()是对应的解码函数,可以将编码后的链接解码回原来的状态。$rawenurl=rawurlencode($enurl);echo$rawenurl,PHP_EOL;//https%253A%252F%252Fwww.zyblog.net%253Fopt%253Ddev%2526mail%253Dzyblog%2540net.net%2526comments%253Daaa%2Bbbb%2Bccc%2B%2525dfg%2B%2526%253D%253D%252A%2528%2529%2Bcdg%2526value%253D%25E2%2580%259C%25E4%25B8%25AD%25E6%2596%2587%25E4%25B9%259F%25E6%259C%2589%25E5%2591%2580%25EF%25BC%258C%25E8%25BF%2598%25E6%259C%2589%25E4%25B8%25AD%25E6%2596%2587%25E7%25AC%25A6%25E5%258F%25B7%25EF%25BC%2581%25EF%25BC%2581%25E2%2580%259Dechorawurldecode($rawenurl),PHP_EOL;//https%3A%2F%2Fwww.zyblog.net%3Fopt%3Ddev%26mail%3Dzyblog%40net.net%26comments%3Daaa+bbb+ccc+%25dfg+%26%3D%3D%2A%28%29+cdg%26value%3D%E2%80%9C%E4%B8%AD%E6%96%87%E4%B9%9F%E6%9C%89%E5%91%80%EF%BC%8C%E8%BF%98%E6%9C%89%E4%B8%AD%E6%96%87%E7%AC%A6%E5%8F%B7%EF%BC%81%EF%BC%81%E2%80%9Dechorawurlencode($url),PHP_EOL;//https%3A%2F%2Fwww.zyblog.net%3Fopt%3Ddev%26mail%3Dzyblog%40net.net%26comments%3Daaa%20bbb%20ccc%20%25dfg%20%26%3D%3D%2A%28%29%20cdg%26value%3D%E2%80%9C%E4%B8%AD%E6%96%87%E4%B9%9F%E6%9C%89%E5%91%80%EF%BC%8C%E8%BF%98%E6%9C%89%E4%B8%AD%E6%96%87%E7%AC%A6%E5%8F%B7%EF%BC%81%EF%BC%81%E2%80%9Dechorawurldecode($enurl),PHP_EOL;//https://www.zyblog.net?opt=dev&mail=zyblog@net.net&comments=aaa+bbb+ccc+%dfg+&==*()+cdg&value="中文还有中文符号!!”然后我们看到了rawurlencode()和rawurldecode()。很多朋友会不明白它们和普通的urlencode()和urldecode()的区别。其实它们的区别主要体现在一些特殊的字符上,比如空格。在urlencode()中,空格被编码为+号,而在urlrawencode()中,空格被编码为%20。在我们的第三个测试代码中可以看到。前两段测试代码是针对之前编码过的\$enurl的操作。第三个测试代码是对原来的$url进行编码。这两个函数是实现RFC3986规范的函数。但是,urlencode()保留了一些特殊情况,例如出于历史原因将空格转换为+号。最后再看两个非常简单的Base64相关的编解码函数。$base64url=base64_encode($enurl);echo$base64url,PHP_EOL;//aHR0cHMlM0ElMkYlMkZ3d3cuenlibG9nLm5ldCUzRm9wdCUzRGRldiUyNm1haWwlM0R6eWJsb2clNDBuZXQubmV0JTI2Y29tbWVudHMlM0RhYWErYmJiK2NjYyslMjVkZmcrJTI2JTNEJTNEJTJBJTI4JTI5K2NkZyUyNnZhbHVlJTNEJUUyJTgwJTlDJUU0JUI4JUFEJUU2JTk2JTg3JUU0JUI5JTlGJUU2JTlDJTg5JUU1JTkxJTgwJUVGJUJDJThDJUU4JUJGJTk4JUU2JTlDJTg5JUU0JUI4JUFEJUU2JTk2JTg3JUU3JUFDJUE2JUU1JThGJUI3JUVGJUJDJTgxJUVGJUJDJTgxJUUyJTgwJTlEechobase64_decode($base64url),PHP_EOL;//https%3A%2F%2Fwww.zyblog.net%3Fopt%3Ddev%26mail%3Dzyblog%40net.net%26comments%3Daaa+bbb+ccc+%25dfg+%26%3D%3D%2A%28%29+cdg%26value%3D%E2%80%9C%E4%B8%AD%E6%96%87%E4%B9%9F%E6%9C%89%E5%91%80%EF%BC%8C%E8%BF%98%E6%9C%89%E4%B8%AD%E6%96%87%E7%AC%A6%E5%8F%B7%EF%BC%81%EF%BC%81%E2%80%9D其实Base64最大的用处并不体现在这个普通字符串的编码上,而是在二进制字符String中编码后传输的作用。这位肯定用过的同学,自然是心知肚明。主要是接口开发,如果用Base64对数据进行编码,一来没有加密的效果,二来可能会增加数据的长度,所以除非有特殊需要,一般的传输确实没有太多。需要对数据进行Base64编码。URL解析操作除了对URL链接中的字符进行编码和解码外,也是我们经常用来解析链接参数的函数。例如:$urls=parse_url($url);var_dump($urls);//array(3){//["scheme"]=>//string(5)"https"//["host"]=>//string(14)"www.zyblog.net"//["query"]=>//string(119)"opt=dev&mail=zyblog@net.net&comments=aaabbbccc%dfg&==*()cdg&value="还有中文,还有中文符号!!""//}通过parse_url()函数,我们可以拆解链接的各个部分。$parseTestUrl='http://username:password@hostname/path?arg=value#anchor';print_r(parse_url($parseTestUrl));//数组//(//[scheme]=>http//[host]=>hostname//[user]=>username//[pass]=>password//[path]=>/path//[query]=>arg=value//[fragment]=>anchor//)上面的测试环节比较规范。我们还可以看到parse_url()可以对协议、地址、用户名、密码、路径、查询语句、分片进行反汇编。这些也是构成URL链接的规范标准。我们也可以指定我们需要什么。echoparse_url($parseTestUrl,PHP_URL_PATH);///path像这样添加第二个参数,只获取我们需要的部分内容。当然,对于整个URL链接,我们最关心的还是query部分的内容。我们可以再拆开它们吗?与$_GET一样获取所有查询数据结果。$querys=[];parse_str($urls['query'],$querys);var_dump($querys);//array(4){//["opt"]=>//string(3)"dev"//["mail"]=>//string(14)"zyblog@net.net"//["comments"]=>//string(15)"aaabbbccc?g"//["value"]=>//string(48)""还有中文,还有中文符号!!""//}parse_str()这个函数就是解析这种URL链接查询语句。需要注意的是,该函数的第二个参数是可选的。如果不使用变量来接收这个函数解析的结果,那么所有的解析结果都会直接转化为变量。可能有点晕,直接看代码。parse_str($urls['query']);echo$value,PHP_EOL;//"中文也可以,还有中文符号!!"现在你可以理解了。为了防止变量污染问题,最好有第二个参数,把解析后的结果存放在我们指定的地方。最后,让我们看看如何将数组组合成一个URL查询语句。echohttp_build_query($querys),PHP_EOL;//opt=dev&mail=zyblog%40net.net&comments=aaa+bbb+ccc+%DFg+&value=%E2%80%9C%E4%B8%AD%E6%96%87%E4%B9%9F%E6%9C%89%E5%91%80%EF%BC%8C%E8%BF%98%E6%9C%89%E4%B8%AD%E6%96%87%E7%AC%A6%E5%8F%B7%EF%BC%81%EF%BC%81%E2%80%9Dechohttp_build_query($querys,null,'$||$',PHP_QUERY_RFC3986),PHP_EOL;//opt=dev$||$mail=zyblog%40net.net$||$comments=aaa%20bbb%20ccc%20%DFg%20$||$value=%E2%80%9C%E4%B8%AD%E6%96%87%E4%B9%9F%E6%9C%89%E5%91%80%EF%BC%8C%E8%BF%98%E6%9C%89%E4%B8%AD%E6%96%87%E7%AC%A6%E5%8F%B7%EF%BC%81%EF%BC%81%E2%80%9Dhttp_build_query()其实做过对外接口开发的都不会陌生用它。因为它太方便了。不过需要注意的是,这个函数会自动用rawurlencode()对数据进行编码。此外,它还有几个可选参数。比如我们修改了第二个测试代码中的连接符号,将原来的&符号替换为我们自己自定义的符号来拼接URL查询语句。解析文件或远程地址的响应头和元信息对于远程文件请求,响应头信息也很重要。其实URL相关的组件也有直接获取响应头的功能。$url='https://www.sina.com.cn';print_r(get_headers($url));//数组//(//[0]=>HTTP/1.1200OK//[1]=>服务器:nginx//[2]=>日期:2021年1月25日星期一02:08:35GMT//[3]=>内容类型:文本/html//[4]=>内容长度:530418//[5]=>连接:关闭//[6]=>变化:接受编码//[7]=>ETag:“600e278a-7c65e”V=5965C31//[8]=>X-Powered-作者:shci_v1.13//[9]=>到期时间:2021年1月25日星期一02:09:12GMT//[10]=>缓存控制:max-age=60//[11]=>X-Via-SSL:ssl.22.sinag1.qxg.lb.sinanode.com//[12]=>Edge-Copy-Time:1611540513080//[13]=>Age:24//[14]=>Via:https/1.1cmcc.guangzhou.union.82(ApacheTrafficServer/6.2.1[cRsf]),https/1.1cmcc.jiangxi.union.175(ApacheTrafficServer/6.2.1[cRsf])//[15]=>X-Via-Edge:1611540515462770a166fee55a97524d289c7//[16]=>X-Cache:HIT.175//[17]=>X-Via-CDN:f=edge,s=cmcc.jiangxi.union.166.nb.sinaedge.com,c=111.22.10.119;f=edge,s=cmcc.jiangxi.union.168.nb.sinaedge.com,c=117.169.85.166;f=Edge,s=cmcc.jiangxi.union.175,c=117.169.85.168//)print_r(get_headers($url,1));//数组//(//[0]=>HTTP/1.1200OK//[Server]=>nginx//[Date]=>Mon,25Jan202102:08:35GMT//[Content-Type]=>text/html//[Content-Length]=>530418//[连接]=>close//[Vary]=>Accept-Encoding//[ETag]=>"600e278a-7c65e"V=5965C31//[X-Powered-By]=>shci_v1.13//[Expires]=>2021年1月25日星期一02:09:12GMT//[Cache-Control]=>max-age=60//[X-Via-SSL]=>ssl.22.sinag1.qxg.lb.sinanode.com//[Edge-Copy-Time]=>1611540513080//[Age]=>24//[Via]=>https/1.1cmcc.guangzhou.union.82(ApacheTrafficServer/6.2.1[cRsf]),https/1.1cmcc.jiangxi.union.175(ApacheTrafficServer/6.2.1[cRsf])//[X-Via-Edge]=>1611540515593770a166fee55a97568f1a9d6//[X-Cache]=>HIT.175//[X-Via-CDN]=>f=edge,s=cmcc.jiangxi.union.165.nb.sinaedge.com,c=111.22.10.119;f=edge,s=cmcc.jiangxi.union.175.nb.sinaedge.com,c=117.169.85.165;f=Edge,s=cmcc.jiangxi.union.175,c=117.169.85.175//)通过get_headers()函数可以直接获取目标地址服务器返回的响应头信息。它的第二个参数可以以键值下标的形式返回数据。除了responseheader之外,我们还可以获取到网站所有meta标签中的内容。var_dump(get_meta_tags($url));//array(11){//["keywords"]=>//string(65)"新浪,新浪,新浪,新浪,新浪网,新浪首页,门户,information"//["description"]=>//string(331)"新浪网24小时为全球用户提供全面及时的中文资讯,内容涵盖国内外突发新闻事件、体育赛事、娱乐时尚、行业资讯、实用资讯等,拥有新闻、体育、娱乐、财经、科技、房产、汽车等30多个内容频道,以及博客、视频、论坛等免费互动交流空间。"//["referrer"]=>//string(6)"always"//["stencil"]=>//string(10)"PGLS000022"//["publishid"]=>//string(8)"30,131,1"//["verify-v1"]=>//string(44)"6HtwmypggdgP1NLw7NOuQBI2TW8+CfkYCoyeB8IDbn8="//["application-name"]=>//string(12)"新浪首页page"//["msapplication-tileimage"]=>//string(42)"//i1.sinaimg.cn/dy/deco/2013/0312/logo.png"//["msapplication-tilecolor"]=>//string(7)"#ffbf27"//["baidu_ssp_verify"]=>//string(32)"c0e9f36397049594fb9ac93a6316c65b"//["sudameta"]=>//string(20)"dataid:wpcomos:96318"//}这个功能不仅对远程链接网站有用,还可以直接查看本地静态文件中所有meta标签的内容,我们只需要将参数的远程链接替换为本地文件的路径即可.大家可以自己试试,今天的内容总结起来比较简单,主要是日常工作中经常用到的这几个函数,但是有些参数的用法可能很多朋友不太清楚,比如par的第二个函数se_str()是参数的问题。所以我一开始就说了,这篇文章是复习和巩固,也起到了加深理解的作用。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/01/source/9。学习PHP中的URL相关操作函数。PHP参考文档:https://www.php.net/manual/zh/book.url.php