
5.3 字符串的基本操作
字符串的基本操作主要包括对字符串的格式化处理、连接切分字符串、查找字符串、替换字符串等。
5.3.1 手动和自动转义字符串中的字符
手动转义字符串数据,就是在引号内(包括单引号和双引号)通过“\”反斜杠使一些特殊字符转义为普通字符。在介绍单引号和双引号的时候已经对这个方法进行了详细的描述。
自动转义字符串的字符,是通过PHP的内置函数addslashes()来完成的。还原这个操作则是通过stripslashes()来完成的。以上两个函数,也经常使用在格式化字符串中以用于MySQL的数据库存储。
5.3.2 计算字符串的长度
计算字符串的长度经常在很多应用中出现,比如输入框输入文字的长度等,都会用到此功能。使用strlen()函数就可以实现这个功能。以下实例介绍计算字符串长度的方法和技巧。
【例5.4】(实例文件:ch05\5.4.php)
<? php $someinput = "这个字符串的长度不长。length is not long."; //定义字符串变量 $length = strlen($someinput); //获取字符串变量的长度 if(strlen($someinput)>50){ echo "输入的字符串的长度不能大于50个字符。"; }else{ echo "允许输入字符串的长度,此字符串长度为$length"; } ?>
运行结果如图5-4所示。

图5-4 程序运行结果
【案例分析】:
(1)其中$someinput为一个字符串变量。strlen($someinput)则直接调用strlen()函数计算出字符串的长度。
(2)在if语句中strlen($someinput)返回字符串长度并与50这一上限作比较。由于$someinput中有中文和英文两种字符,它的长度为41,正如输出所示。
(3)由于每个中文字占两个字符位,每个英文字符占一个字符位,字符串内的每个空格也算一个字符位,所以,最后字符串的长度为41个字符。
5.3.3 字符串单词统计
有时对字符串的单词进行统计有更大意义。使用str_word_count()函数可以实现此操作,但是这个函数只对基于ASCII码的英文单词起作用,并不对UTF8的中文字符起作用。
下面通过实例介绍字符串单词统计中的应用和技巧。
【例5.5】(实例文件:ch05\7.php)
<? php $someinput = "How many words in this sentance? Just count it."; //定义 字符串变量 $someinput2 = "这个句子由多少个汉字组成?数一数也不知道。"; echo str_word_count($someinput)."<br />"; //计算单词个数 echo str_word_count($someinput2); ?>
运行结果如图5-5所示。可见str_word_count()函数无法计算中文字符,查询结果为0。

图5-5 程序运行结果
5.3.4 清理字符串中的空格
空格在很多情况下是不必要的,所以清除字符串中的空格显得十分重要。比如在判定输入是否正确的程序中,出现了不必要的空格,将增大程序出现错误判断的机率。
清除空格要用到ltrim()、rtrim()和trim()函数。其中ltrim()是从左面清除字符串头部的空格。rtrim()是从右面清除字符串尾部的空格。trim()则是从字符串两边同时去除头部和尾部的空格。
以下实例介绍去除字符串中空格的方法和技巧。
【例5.6】(实例文件:ch05\5.6.php)
<? php $someinput = " 这个字符串的空格有待处理。"; //定义字符串变量 echo "Output:".ltrim($someinput)."End <br />"; //清理字符串头部的空格 echo "Output:".rtrim($someinput)."End <br />"; //清理字符串头部尾部的空格 echo "Output:".trim($someinput)."End <br />"; //同时去除头部和尾部的空格 $someinput2 = " 这个字符串 的 空格有待处理。"; //定义中间有空格的字符串变量 echo "Output:".trim($someinput2)."End"; //同时去除头部和尾部的空格 ?>
运行结果如图5-6所示。

图5-6 程序运行结果
【案例分析】:
(1)其中,$someinput为一个两端都有空格的字符串变量。ltrim($someinput)从左边去除空格,rtrim($someinput)从右面去除空格,trim($someinput)从两边同时去除,得到输出如图5-6所示。
(2)其中$someinput2为一个两端都有空格,并且中间也有空格的字符串变量。用trim($someinput2)处理,但还只是去除两边的空格。
5.3.5 字符串的切分与组合
字符串的切分使用explode()和strtok()函数。切分的反向操作为组合,使用implode()和join()函数。其中explode()把字符串切分成不同部分后,存入一个数组。Impolde()函数则是把数组中的元素按照一定的间隔标准组合成一个字符串。
以下实例介绍去除字符串切分和组合的方法和技巧。
【例5.7】(实例文件:ch05\5.7.php)
<? php $someinput = "How_to_split_this_sentance."; //定义字符串变量 $someinput2 = "把 这个句子 按空格 拆分。"; //定义按空格拆分的字符串 $a = explode('_', $someinput); //切分字符串someinput print_r($a); //输出切分后的字符串 $b = explode(' ', $someinput2); print_r($b); echo implode('>', $a)."<br />"; //组合字符串$a echo implode('*', $b); ?>
运行结果如图5-7所示。

图5-7 程序运行结果
【案例分析】:
(1)其中explode()函数把$someinput和$someinput2按照下划线和空格的位置把它们分别切分成$a和$b两个数组。
(2)其中implode()函数把$a和$b两个数组的元素分别按照“>”和“*”为间隔组合成新的字符串。
5.3.6 字符串子串的截取
在一个字符串中截取一个子串,就是字符串截取。
完成这个操作需要用到substr()函数。这个函数有3个参数,分别规定了目标字符串、起始位置和截取长度。它的格式如下:
substr(目标字符串,起始位置,截取长度)
其中目标字符串是某个字符串变量的变量名,起始位置和截取长度都是整数。
如果都是正数,起始位置的整数必须小于截取长度的整数,否则函数返回值为假。
如果截取长度为负数,则意味着,是从起始位置开始往后除去从目标字符串结尾算起的长度数的字符以外的所有字符。
以下实例介绍去除字符串截取的方法和技巧。
【例5.8】(实例文件:ch05\5.8.php)
<? php $someinput = "create a substring of this string."; //定义字符串变量$someinput $someinput2 = "创建一个这个字符串的子串。"; echo substr($someinput,0,11)."<br />"; //截取字符串前11个字符 echo substr($someinput,1,15)."<br />"; //截取从第二个字符开始的前15个字 符 echo substr($someinput,0, -2)."<br />"; //截取除最右侧两个字符外的字符 echo substr($someinput2,0,12)."<br />"; //截取字符串前12个字符 echo substr($someinput2,0,10)."<br />"; //截取字符串前10个字符 echo substr($someinput2,0,11); //截取字符串前11个字符 ?>
运行结果如图5-8所示。

图5-8 程序运行结果
【案例分析】:
(1)其中$someinput为英文字符串变量。substr($someinput,0,11)和substr($someinput,1,15)展示了起始位和截取长度。substr($someinput,0, -2)则是从字符串开头算起,除了最后两个字符,其他字符都截取的子字符串。
(2)其中$someinput2为中文字符串变量。因为中文字符是全角字符,都占两个字符位,所以截取长度一定要是偶数。如果是单数则在此字符位上的汉字将不被输出。如果在这样截取长度为单数的字符串子串后连接其他字符串输出,会出现输出错误。所以,要小心使用。
5.3.7 字符串子串替换
在某个字符串中替换其中的某个部分是重要的应用,就像在使用文本编辑器中的替换功能一样。
完成这个操作需要使用substr_replace()函数,它的格式为:
substr_replace(目标字符串,替换字符串,起始位置,替换长度)
以下实例介绍字符串替换的方法和技巧。
【例5.9】(实例文件:ch05\5.9.php)
<? php $someinput = "ID:125846843388648"; //定义字符串变量 echo substr_replace($someinput, "************",3,11)."<br />"; //字符串字串 替换 echo substr_replace($someinput, "尾号为",3,11); //输出替换后的字符串 ?>
运行结果如图5-9所示。

图5-9 程序运行结果
【案例分析】:
(1)其中,$someinput为英文字符串变量。从第三个字符开始为ID号。第一个输出是以“************”替换第三个字符开始往后的11个字符。
(2)第二个输出是用“尾号为”替代第三个字符开始往后的11个字符。
5.3.8 字符串查找
在一个字符串中查找另外一个字符串,就像文本编辑器中的查找一样。实现这个操作需要用到strstr()或stristr()函数。其格式为:
strstr(目标字符串,需查找字符串)
如果函数找到需要查找的字符或字符串,则返回从第一个查找到字符串的位置往后所有的字符串内容。
stristr()函数为不敏感查找,也就是对字符的大小写不敏感。用法与strstr()相同。
以下实例介绍字符串查找的方法和技巧。
【例5.10】(实例文件:ch05\5.10.php)
<? php $someinput = "I have a Dream that to find a string with a dream."; //定义英 文字符串 $someinput2 = "我有一个梦想,能够找到理想。"; //定义中文字符串 echo strstr($someinput, "dream")."<br />"; //查找指定的字符 串 echo stristr($someinput, "dream")."<br />"; echo strstr($someinput, "that")."<br />"; echo strstr($someinput2, "梦想")."<br />"; ?>
运行结果如图5-10所示。

图5-10 程序运行结果
【案例分析】:
(1)其中$someinput为英文字符串变量。strstr($someinput, "dream")大小写敏感,所以输出字符串最后的字符。stristr($someinput, "dream")大小写不敏感,所以直接在第一个大写的匹配字符就开始输出。
(2)其中$someinput2为中文字符串变量。strstr()函数同样对中文字符起作用。
5.3.9 大小写转换
在PHP中,通过使用大小写转换函数,可以修改字符串中字母大小不规范的问题。常见的大小写转换函数如下:
srting strtolower(srting str); //转换为小写 srting strtoupper(srting str); //转换为大写 srting ucfirst(srting str); //整个字符串首字母大写 srting ucwords(srting str); //整个字符串中以空格为分隔符的单词首字母大写
【例5.11】(实例文件:ch05\5.11.php)
<? php $str = "hello I have a dream" ; //定义英文字符串 echo strtolower($str)."<br />"; //转换为小写 echo strtoupper($str)."<br />"; //转换为大写 echo ucfirst($str)."<br />"; //整个字符串首字母大写 echo ucwords($str)."<br />"; //整个字符串中以空格为分隔符的单词首字母大写 echo $aa; //输出原字符串 ?>
运行结果如图5-11所示。

图5-11 程序运行结果