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()计算字符串散列