6.8其他常见的字符串操作
6.8 其他常见的字符串操作
除了前文介绍的这些字符串操作外,PHP还提供了一些对字符串进行处理的函数,如大小写转换、字符数组的转换等,本节就讲解这些特殊处理的相关知识。
6.8.1 对字符串做大小写转换
PHP提供了两个函数分别完成对字符串中字母的大小写转换,如下。
·strtoupper($str),将字符串$str中的字母全部转换为大写字母。
·strtolower($str),将字符串$str中的字母全部转换为小写字母。
代码6-15演示了这两个函数的用法。
代码6-15 对字符串中的字母做大小写转换6-16.php
01 <?php
02 $str = "I love PHP!";
03
04 $str_to_lower = strtolower($str); //
转换字符串为小写
05 $str_to_upper = strtoupper($str); //
转换字符串为大写
06
07 echo "
原始字符串:$str";
08 echo "<br/>";
09 echo "<br/>";
10
11 echo "
全部转换成小写:$str_to_lower";
12 echo "<br/>";
13 echo "<br/>";
14
15 echo "
全部转换成大写:$str_to_upper";
16 ?>
【代码解析】学习过一门语言的读者可能都知道,带upper的一般都表示大写,带lower的一般表示小写,不管是C语言,还是C#、Java语言,都有这方面的大小写转换函数。这段代码的执行结果如图6-15所示。
6.8.2 处理含有HTML标记的字符串
使用PHP进行Web页面开发,经常会遇到处理HTML标记的问题。PHP提供的函数htmlentities()可以完成对字符串中HTML标记的处理,该函数可将字符串中有关字符转换成HTML实体,即HTML字符编码。该函数的语法如下。
string htmlentities(string $str);
函数htmlentities()将字符串$str中的HTML标记(如<、>等)转换成相关编码的形式。代码6-16演示了该函数的用法。
代码6-16 使用函数htmlentities()处理字符串中的HTML标记6-16.php
01 <?php
02 $str = "<b>I love PHP!</b>";
03 $str_entity = htmlentities($str); //
处理字符串中的HTML
标记
04
05 echo "
转换前:$str";
06 echo "<br/>";
07 echo "<br/>";
08
09 echo "
转换后:$str_entity";
10 ?>
【代码解析】如果读者还不知道HTML标签的意义,请返回第1章查看。<b>表示将字符串加粗显示。如果不转化成HTML编码形式,那字符串会原样输出文字。这段程序的执行结果如图6-16所示。

图6-15 对字符串中的字母做大小写转换

图6-16 处理字符串中的HTML标记
从执行结果可以看出,转换前,浏览器将字符串“<b>I love PHP!</b>”做解析,然后将其以粗体文字的形式显示到浏览器上;而转换后,HTML标记被原模原样地显示到浏览器上。事实上,转换后,字符串变成了“<b>I love PHP!</b>”,这时浏览器将其解析为<b>I love PHP</b>,并且输出到浏览器端。通过查看该页面的源代码可以更清楚地了解这一点。程序6-16.php执行后页面源代码如下,其中字符<转换成HTML实体<,字符>转换成HTML实体>。HTML实体通常以&开头,以;结束。
转换前:<b>I love PHP!</b><br/> 转换后:<b>I love PHP!</b>
还有一个和htmlentities()功能类似的函数,即htmlspecialchars(),该函数可以将特殊符号转换成HTML实体。它主要转换的特殊符号有如下几个。
·&:转换成&。
·“(双引号):转换成"。
·<(小于号):转换成<
·>(大于号):转换成>
函数htmlspecialchars()的用法和函数htmlentities()类似,这里不再赘述。
PHP还提供了将HTML实体转换成相关字符的函数html_entity_decode()。该函数的语法如下。
string html_entity_decode(string $str);
该函数将字符串$str中的HTML实体转换成相关的字符,它可以看做是函数htmlentities()的逆运算。代码6-17演示了该函数的用法。
代码6-17 使用函数html_entity_decode()将HTML实体转换成相关字符6-17.php
01 <?php
02 $str = "<a href="http://www.php.net">PHP language website</a>";
03
04 $str_entity = htmlspecialchars($str);
05 $str_html = html_entity_decode($str_entity); //
将HTML
实体转换成字符
06
07 echo "
调用函数htmlspecialchars
后:";
08 echo "<br/>";
09 echo $str_entity;
10
11 echo "<br/>";
12 echo "<br/>";
13
14 echo "
调用函数html_entity_decode
后:";
15 echo "<br/>";
16 echo $str_html;
17 ?>
【代码解析】代码第02行定义的变量中包含了<a>标签,这是一个链接标签。第04行先去掉变量中的特殊字符,然后第05行使用html_entity_decode()转换HTML实体。这段代码的执行结果如图6-17所示。
6.8.3 多次生成一个字符串
函数str_repeat()可以用来重复生成一个字符串,该函数的语法如下。
string str_repeat (string $input, int $num)
函数str_repeat()有两个参数,第1个参数$input是要重复生成的字符串;第2个参数$num是要重复的次数。参数$num的取值必须大于等于0,如果$num设置为0,该函数会返回一个空字符串。代码6-18演示了该函数的用法。
代码6-18 用函数str_repeat()重复生成字符串6-18.php
01 <?php
02 $str = "jingle bells
~, ";
03
04 echo "
重复输出两次:";
05 echo "<br/>";
06 echo str_repeat($str,2); //
重复生成字符串两次
07
08 echo "<br/>";
09 echo "<br/>";
10 echo "
当函数str_repeat()
第2
个参数为0
时:";
11 echo "<br/>";
12 echo "s=".str_repeat($str,0);
13 ?>
【代码解析】这段代码的执行结果如图6-18所示。从中可以看出,当函数str_repeat()第2个参数设定为0时,函数str_repeat()生成一个空字符串。

图6-17 使用html_entity_decode()转换HTML实体

图6-18 重复生成字符串
还有一个函数str_pad()和str_repeat()类似,该函数用一个字符串补全另一个字符串的一定长度,也就是相当于一个字符串可能会多次生成。函数str_pad()的语法如下。
string str_pad (string $input, int $pad_length [, string $pad_string [, int $pad_type]])
该函数将参数字符串$input补全到长度为$pad_length时返回,可以在字符串$input的左边、右边或者左右两边进行补全。可选参数$pad_string用来补全的字符串,如果没有指定该参数,将默认使用空格进行补全。可选参数$pad_type用来指定补全方式,该参数的取值为STR_PAD_RIGHT(在右边进行补全)、STR_PAD_LEFT(在左边进行补全)、STR_PAD_BOTH(同时在两边进行补全),如果没有指定该参数,将在原字符串右边进行补全。代码6-19演示了该函数的用法。
代码6-19 重复字符串来补全另一个字符串6-19.php
01 <?php
02 $input = "Story";
03
04 echo "/".str_pad($input, 10)."/"; //
输出字符串
05 echo "<br/>";
06 echo "<br/>";
07
08 echo str_pad($input, 10, "-*", STR_PAD_LEFT); //
用-*
左端补齐字符串
09 echo "<br/>";
10 echo "<br/>";
11
12 echo str_pad($input, 10, "*", STR_PAD_BOTH); //
用*
两端补齐字符串
13 echo "<br/>";
14 echo "<br/>";
15
16 echo str_pad($input, 6 , "***"); //
在右边补齐***
17 ?>
【代码解析】代码第04行没有指定要补全的字符串,所以默认为用空格补全。第08、第12行都指定了用来补全的字符串,同时还指定了补全方式。代码6-19的执行结果如图6-19所示。
6.8.4 将字符串分析到变量
本小节所说的分析字符串是指分析URL中的查询字符串。例如一个URL是http://www.somesite.com/index.php?i=000&key=1a2b3c&cnt=10,那么该URL的查询字符串就是i=000&key=1a2b3c&cnt=10。PHP提供了函数parse_str()用于分析类似的字符,并将分析结果赋值给变量。函数parse_str()的语法如下。
void parse_str(string $str [, array $arr])
本函数可将URL的查询字符串参数$str解析,返回的变量名及值与查询字符串中的名称及值相对应。该函数第2个参数是一个指定的数组,是可选的,如果指定这个数组参数,那么函数parse_str()将分析字符串得到变量作为数组索引、值作为数组元素存入该数组。代码6-20很清楚地演示了该函数的用法。
代码6-20 分析字符串到变量6-20.php
01 <?php
02 $str = "first=php&second[]=string+functions&second[]=useing";
03 echo "
原字符串:";
04 echo "<br/>";
05 echo $str;
06
07 parse_str($str); //
分析字符串
08 echo "<br/>";
09 echo "<br/>";
10
11 echo "
分析结果:";
12 echo "<br/>";
13 echo "first = ".$first;
14 echo "<br/>";
15 echo "second[0] = ".$second[0];
16 echo "<br/>";
17 echo "second[1] = ".$second[1];
18
19 parse_str($str,$input); //
将分析结果保存到数组
20 echo "<br/>";
21 echo "<br/>";
22
23 echo "
指定输出数组参数的结果:";
24 echo "<br/>";
25 echo "input["first"] = ".$input["first"];
26 echo "<br/>";
27 echo "input["second"][0] = ".$input["second"][0];
28 echo "<br/>";
29 echo "input["second"][1] = ".$input["second"][1];
30 echo "<br/>";
31 ?>
【代码解析】代码第07行和第19行都使用了函数parse_str(),其中第07行没有带第2个参数,第19行就带来第2个参数,所以这里$input其实是一个数组,可以使用第27、29行代码实现数组元素的输出。代码6-20的执行结果如图6-20所示。

图6-19 使用字符串对另一字符串进行补全

图6-20 分析字符串到变量
6.8.5 转换字符串到数组
PHP提供的函数str_split()可将字符串转换成一个数组,即将数组分割成几个部分,每个部分的值作为数组的元素。该函数的语法如下。
array str_split(string $str [, int $split_length])
该函数将字符串$str做分割,将分割后的字符串各部分存入数组,并将数组返回。可选参数$split_length用来指定分割字符串长度。如果没有指定该参数,函数将把字符串$str按一个字符的长度分割。代码6-21演示了该函数的用法。
代码6-21 转换字符串到数组6-21.php
01 <?php
02 $str = "How are you?";
03 echo "
原字符串:";
04 echo "<br/>";
05
06 echo $str;
07 echo "<br/>";
08 echo "<br/>";
09
10 $arr1 = str_split($str); //
将转换结果保存到数组
11 $arr2 = str_split($str, 3); //
指定数组的3
个元素
12
13 echo "<pre>";
14 print_r($arr1);
15 print_r($arr2);
16 echo "</pre>";
17 ?>
【代码解析】代码6-21的执行结果如图6-21所示。从结果可以看出,字符串中的空白字符也会被存入数组。当函数str_split()指定第2个参数时,字符串将按第2个参数所指定长度的字符串来截取原字符串。

图6-21 将字符串转换到数组
6.8.6 计算字符串的散列
散列主要用于信息安全领域的加密算法,它把任意长度的输入(又叫做预映射)转化成杂乱的128位的编码,这个编码叫做散列值。也可以说,散列就是找到一种数据内容和数据存放地址之间的映射关系。常见的散列算法有MD5、SHA1等。
PHP中提供了对应的函数用于完成对字符串做MD5散列计算,也提供了函数完成SHA1散列计算,这两个函数分别是md5()和sha1()。函数md5()的语法如下。
string md5(string $str )
该函数用来计算参数字符串$str的MD5散列。函数sha1()的语法如下。
string sha1(string $str )
该函数用来计算参数字符串$str的SHA1散列。代码6-22是这两个函数的使用示例程序。
代码6-22 使用函数md5()和sha1()计算字符串的散列值6-22.php
01 <?php
02 $str1 = "This is a secret";
03 $str2 = "root";
04
05 echo "
原字符串:";
06 echo "<br/>";
07 echo "str1=".$str1;
08 echo "str2=".$str2;
09 echo "<br/>";
10 echo "<br/>";
11
12 echo "
使用md5
加密:";
13 echo "<br/>";
14 echo "md5($str1)=".md5($str1); //
输出MD5
值
15 echo "<br/>";
16 echo "md5($str2)=".md5($str2); //
输出MD5
值
17
18 echo "<br/>";
19 echo "<br/>";
20
21 echo "
使用sha1
加密:";
22 echo "<br/>";
23 echo "sha1($str1)=".sha1($str1); //
输出SHA1
值
24 echo "<br/>";
25 echo "sha1($str2)=".sha1($str2); //
输出SHA1
值
26 ?>
【代码解析】代码6-22的执行结果如图6-22所示。从中看出,无论原字符串的长度是多少,经过函数md5()和sha1()的计算,最终分别会得到长度一样的散列数值。

图6-22 使用md5()和sha1()计算字符串散列
上一篇:6.7获取字符串的长度
下一篇:6.9小结
