每当此时,你将不得不在不同的网页和服务之间传递URLs。这听起来是一个相当容易的任务,因为URL基本上只是文本字符串,但事情有时会变得复杂。例如,有时你需要在另一个URL中对一个URL进行编码,例如在一个GET请求中!
在本教程中,你将了解为什么需要对URL进行编码或解码,以及如何使用内置的PHP函数来完成。
对URL进行编码和解码的必要性
也许你想把一个URL作为查询参数传递给一个Web服务或另一个Web页面。比如说,你想把下面的数据作为一个查询字符串发送给一个网站。
| 关键 | 数据 |
| 重定向 | https://code.tutsplus.com |
| 作者 | Monty Shokeen |
| 页码 | 2 |
这些信息将被编码为以下查询字符串。
https://www.example.com?redirect=https%3A%2F%2Fcode.tutsplus.com&author=monty%20shokeen&page=2
请注意,"重定向 "URL中的特殊字符如: 和/ 已经被编码为%3A 和%2F ,以避免干扰整个URL的结构。这被称为转义,这就是编码功能的作用。
example.com的服务器将收到查询字符串中的编码URL,并可能需要稍后对其进行解码。这就是URL解码的重要性所在。
用urlencode() 和rawurlencode()对URL进行编码
在PHP中有两个不同的函数用于对URL进行编码。它们被称为urlencode() 和rawurlencode() 。这两个函数的主要区别在于它们所编码的字符集以及它们如何处理空格。
在urlencode() 的情况下,该函数将所有其他非字母数字字符(除了- 、_ 和. )替换为百分号和两个十六进制数字。任何空格都被替换为+ 字符。另一方面,rawurlencode() 函数将所有其他非字母数字字符(除了-,_,., 和~ )用一个百分号和两个十六进制数字替换。这个函数还用百分号和两个十六进制数字替换了空格:%20 。
下面的例子应该能让你明白一些事情。
<?php
$url_string = 'https://code.tutsplus.com/tutorials?query=php basics&page=2';
$urlencoded_string = urlencode($url_string);
echo $urlencoded_string;
Output: https%3A%2F%2Fcode.tutsplus.com%2Ftutorials%3Fquery%3Dphp+basics%26page%3D2
$rawurlencoded_string = rawurlencode($url_string);
echo $rawurlencoded_string;
Output: https%3A%2F%2Fcode.tutsplus.com%2Ftutorials%3Fquery%3Dphp%20basics%26page%3D2
正如你所看到的,像?,/ 和= 这样的非字母数字字符被两个函数以同样的方式编码。然而,urlencode() 函数将php basics 改为php+basics ,而rawurlencode() 则将其改为php%20basics 。
一般来说,使用rawurlencode() 对你的所有URL进行编码是一个好主意。这有几个原因。首先,rawurlencode() 功能是基于更现代的RFC 3986方案对URL进行编码。第二,如果你编码的URL以后要在JavaScript中解码,它可以提供更好的兼容性。
用urldecode() 和rawurldecode()解码URLs
函数urldecode() 和rawurldecode() 是用来回滚相应的urlencode() 和rawurlencode() 函数所做的修改。
这基本上意味着,所有包含百分号后的两个十六进制字符串的序列将被替换为其适当的字符。urldecode() 函数将把**+**符号改为空格字符,而rawurldecode() 函数将保持不变。
下面是一个例子来说明其中的区别。
<?php
$urlencoded_string = 'https%3A%2F%2Fcode.tutsplus.com%2Ftutorials%3Fquery%3Dphp+basics%26page%3D2';
echo urldecode($urlencoded_string);
//Output: https://code.tutsplus.com/tutorials?query=php basics&page=2
echo rawurldecode($urlencoded_string);
Output: https://code.tutsplus.com/tutorials?query=php+basics&page=2
$rawurlencoded_string = 'https%3A%2F%2Fcode.tutsplus.com%2Ftutorials%3Fquery%3Dphp%20basics%26page%3D2';
echo urldecode($rawurlencoded_string);
Output: https://code.tutsplus.com/tutorials?query=php basics&page=2
echo rawurldecode($rawurlencoded_string);
Output: https://code.tutsplus.com/tutorials?query=php basics&page=2
在上面的例子中,我们用解码函数对我们在前面的例子中编码的URL进行了解码。$urlencoded_string 变量中的空格字符被改成了+ 。对这个字符串使用urldecode() 函数将其改回了空格字符。然而,rawurldecode() 函数却没有触动它。
$rawurlencoded_string 变量的空格字符被转换为%20 ,urldecode() 和rawurldecode() 的处理方式相同。
重要的是,要小心你用来解码一个已编码的URL的函数,因为最终的结果可能会因你最初使用的编码而有所不同。
最后的思考
我们在本教程中的重点是教你如何在PHP中对URL进行编码和解码。我们从对URL进行编码和解码的需要开始,然后简要介绍了四个不同的函数来完成这个任务。
正如我前面提到的,最安全的做法是在任何地方使用rawurlencode() 和rawurldecode() 。这将确保你自己代码的一致性,以及与其他使用新的URL编码和解码方案的语言的兼容性。