9.1 URL地址分析
在PHP的实际应用中,对URL地址的处理主要涉及URL的编码、解码及分析3个方面,PHP提供了3个函数,对URL进行处理。它们是urlencode()、urldecode()和parse_url()。
9.1.1 为什么要对URL进行处理
有时需要将一个URL作为一个整体,通过另一个URL传递给一个程序,即将一个URL作为参数传递给另外一个URL。因为被传递的URL里也可能带有查询字符串,为避免和原URL的参数冲突,需要将被传递的URL进行处理,也就是要对URL做编码。此外,对于中文参数值的传递也应该进行URL编码。因此,对URL编码是PHP开发中经常碰到的问题,初学者有必要掌握基本的处理函数。
9.1.2 对URL进行编码
PHP提供了函数urlencode对URL进行编码,语法如下。
string urlencode ( string $str);
函数urlencode()接受一个字符串参数作为输入,返回值也是一个字符串,返回值字符串中的所有非字母和数字字符变成一个百分号(%)和一个两位的十六进制数,如字符串“&”会被转换成“%26”。
说明 空格则会被转换成一个加号(+)。另外,函数urlencode()不会对-、_和.(英文句点)符号做转换。
代码9-1演示了如何将一个URL地址编码后输出。
代码9-1 对URL进行编码9-1.php
01 <?php 02 $url = "http://localhost.com/?user=abcd&code=1234"; // 定义url 变量 03 $decode_url = urlencode($url); // 对url 进行编码 04 05 echo " 编码前,URL 为:<br/>".$url."<br/>"; 06 echo "<br/>"; 07 echo "<hr>"; 08 echo "<br/>"; 09 10 echo " 编码后,URL 为:<br/>".$decode_url; 11 ?>
【代码解析】代码第02行定义了一个URL的地址变量$url,从代码中可以看出,用户名和密码都被暴露在外面。第03行通过urlencode()函数对地址进行编码,这样就不能轻易读取用户名和密码了。这段程序在页面输出的结果如图9-1所示。
图9-1 对URL编码
9.1.3 对URL进行解码
PHP提供了函数urldecode()对编码过的字符串解码,这个函数可以看做是上9.12节所介绍的函数urlencode()的逆运算,语法如下。
string urldecode (string $str )
函数urldecode()的参数是一个字符串,此函数将编码后诸如%##形式的字符串解码,如将“id%3D007”转换成“id=007”。代码9-2所示的程序会将9.12小节编码的URL地址解码,然后将结果输出到页面。
代码9-2 对编码的URL进行解码9-2.php
01 <?php 02 $url_encode="http%3A%2F%2Flocalhost.com%2F%3Fuser%3Dabcd%26code%3D1234";// 编码后的url 03 $url_str = urldecode($url_encode); // 对编码的url 进行解码 04 05 echo " 解码前,URL 为:<br/>".$url_encode."<br/>"; 06 echo "<br/>"; 07 echo "<hr>"; 08 echo "<br/>"; 09 10 echo " 解码后,URL 为:<br/>".$url_str; 11 ?>
【代码解析】代码第02行是一个完全看不出任何规律的URL地址,第03行通过函数urldecode()对URL进行解码,这段程序输出结果如图9-2所示,从结果就可以看出URL的规律了。
图9-2 对URL解码
9.1.4 对URL地址进行分析
一个有效的URL地址由多个部分组成,如协议部分、主机(或IP地址)部分、端口号等。有时在程序中需要使用URL地址的某些部分,单纯通过字符串处理函数也可以获取这些部分,但那样做会降低效率,也比较容易出现一些错误。
PHP提供了函数parse_url(),专门用来分析一个有效的URL地址,通过这个函数获取URL地址的各个部分,语法如下。
parse_url ( $url );
函数parse_url()的参数是一个URL地址字符串,返回值是一个关联数组,此数组中存储了URL地址的各个部分,关联数组的每个索引对应URL地址的每个部分。这个关联数组包括如下内容。
·scheme:协议。
·host:主机IP地址或域名。
·port:端口号。
·user:用户名。
·pass:用户密码。
·path:访问路径。
·query:查询参数字符串。
·fragment:参数片段。
下面通过代码9-3所示程序了解函数parse_url()的使用。
代码9-3 使用函数parse_url()分析一个URL 9-3.php
01 <?php 02 $url = "http://www.somesite.com:8000/php/code?id=100&cid=900"; //url 变量 03 $ret_arr = parse_url($url); // 分析指定的url 04 05 echo " 要分析的地址:<br/>".$url; 06 echo "<hr>"; 07 08 echo "<pre>"; 09 echo " 分析结果如下:<br/>"; 10 print_r($ret_arr); 11 ?>
【代码解析】这段程序第02~03行将URL字符串http://www.somesite.com/php/code?id=100&cid=900作为参数传给函数parse_url(),该函数会将这个字符串做分析后分解成几个部分存入关联数组。程序将函数的返回值赋给变量$ret_arr,最后用print_r输出这个关联数组。代码9-3的最终输出结果如图9-3所示。
图9-3 使用parse_url()分析URL
在这个程序执行结果的关联数组中,索引scheme代表URL地址的协议部分(http),索引host代表主机域名部分(www.somesite.com),索引port代表访问端口部分(8000),索引path表示URL地址的路径部分(/php/code),索引query表示URL地址的查询字符串部分(id=100&cid=900)。
注意 函数parse_url()不能用来验证URL地址是否合法,而只是分解URL地址的各个部分。对一个不完整的URL,函数parse_url()会尝试将其正确解析;对于完全不合格的URL,函数parse_url()会返回FALSE。