字符串处理函数-1
字符串处理函数-2
字符串处理函数-3
8.3.3 字符串处理函数
8.3.3.1 字符串处理函数概述
在web编程中,字符串是使用最为频繁的数据类型之一。因为PHP不是一门强固类型化语言,因此很多数据都可以方便的作为字符串来处理。字符串操作是编程中极为常用的操作,从简单的打印输出一行字符串到复杂的正则表达式等,处理目标都是字符串。PHP提供了大量实用的函数,可以帮助用户完成许多复杂的字符串处理工作。PHP提供的字符串处理函数及其功能如表8-2所示。
表8-2列出了常用的PHP字符串操作函数。
8.3.3.2 trim()、ltrim()、rtrim()、chop()和strlen()函数
这5个函数中前4个函数的功能类似,因此将其放在一起介绍。chop()函数与rtrim()函数作用相同,都是去除字符串右端的空格。ltrim()用来去除字符串左端的空格,而trim()用来去除字符串左右两端的空格。
下面来看一个例子,其中用到了另外一个字符串处理函数strlen()来获得字符串的长度。
1: <!--文件8-6.php:去除字符串两端空格-->
2: <HTML>
3: <HEAD>
4: <TITLE>去除字符串两端空格</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $str=" 你看不到我 我是空格 ";
9: echo "方括号中为原始字符串:[".$str."]<br>";
10: echo "原始字符串长度:".strlen($str)."<br>";
11: $str1=ltrim($str);
12: echo "执行ltrim()之后的长度:".strlen($str1)."<br>";
13: $str2=rtrim($str);
14: echo "执行rtrim()之后的长度:".strlen($str2)."<br>";
15: $str3=trim($str);
16: echo "执行trim()之后的长度".strlen($str3)."<br>";
17: echo "去掉首尾空格之后的字符串:[".$str3."]";
18: ?>
19: </BODY>
20: </HTML>
程序的运行结果如图8-6所示。
图8-6 程序8-6.php运行结果
在程序8-6.php中,首先构造了一个字符串$str,这个字符串由9个汉字和4个空格组成,4个空格中有2个在左侧,1个在中间,1个在右侧(由于浏览器会忽略掉连续的空格,因此在浏览器中连续的两个空格的显示效果与一个空格相同)。由于每个汉字占2个字节,每个英文半角空格占1个字节,因此初始字符串的长度为9*2 4=22。用strlen()函数来输出其长度。
首先执行ltrim()函数,将返回结果存放在$str1中。由于ltrim()函数会去掉字符串左侧的所有连续的空格,因此两个空格就被去掉,$str2的字符串长度为20。
然后执行rtrim()函数,将返回结果存放在$str2中。rtrim()函数去掉了字符串$str的右侧一个空格,因此$str2的长度为21。
最后执行trim()函数。trim()函数去除字符串左右两侧的所有空格,因此左侧的2个空格和右侧的1个空格被去掉,剩余的部分长度为19。通过$str3的输出也可以看出,字符串两侧的空格已经消失。
去除连续的空格往往用在做字符串比较之前。要比较两个字符串是否相同时,如果其中一个字符串首尾带有空格,那比较结果就会为假。如"abc"和"abc"这两个字符串,看似内容完全相同,但由于后者多面多了一个空格,在比较时会返回false。因此比较两个字符串变量的值是否相同时,往往首先用trim函数处理一下两侧的空格。
值得注意的是,trim系列函数只去除字符串两侧的空格,而不会去除中间的空格。如例8-6.php中,“你看不到我”和“我是空格”之间有一个空格。调用这3个函数之后空格仍然存在,说明字符串中间的空格不会受影响。如果确实想去除掉一个字符串中的所有空格,可以使用后面要讲的字符串替换函数来实现。
8.3.3.3 ucwords()、ucfirst()、strtoupper()、strtolower()、str_word_count()函数
这5个函数对字符串中的单词进行处理,包括转换大小写转换、计算单词个数等。还是通过一个例子来了解它们的用法。
1: <!--文件8-7.php:字符串中的单词处理-->
2: <HTML>
3: <HEAD>
4: <TITLE>字符串处理中的单词处理</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $str="ni hao, wo jiao Wang Xiao-ming.";
9: echo "原始字符串:".$str."<br>";
10: $str1=ucfirst($str);
11: echo "执行ucfirst()之后:".$str1."<br>";
12: $str2=ucwords($str);
13: echo "执行ucwords()之后:".$str2."<br>";
14: $str3=strtoupper($str);
15: echo "执行strtoupper()之后:".$str3."<br>";
16: $str4=strtolower($str);
17: echo "执行strtolower()之后:".$str4."<br>";
18: echo "字符串中一共有:".str_word_count($str)."个单词。";
19: ?>
20: </BODY>
21: </HTML>
程序的运行结果如图8-7所示。
图8-7 程序8-7.php的运行结果
程序8-7.php中,构造了一个包含有6个单词、大小写混合的字符串,并用它来测试函数的运行结果。程序调用ucfirst()函数将整个字符串首字母变为大写,调用ucwords()函数将每个单词的首字母变为大写,调用strtoupper()函数将全部字母都变成大写,调用strtolower()函数将所有字母变成小写,最后调用str_word_count()函数统计字符串中的单词个数。
8.3.3.4 字符串查找函数
程序中经常用到在一个字符串中查找某个字符或者某个子串的操作;对字符串中的某些字符按照用户的需求进行替换操作以及截取字符串的一部分等。PHP都已经准备好了一系列函数实现这些操作,用户只需要了解函数的使用方法,即可轻松实现。
常用的字符串查找函数有substr_count()、strpos()、strrpos()、strstr()、strrchr()等。它们的使用方法和功能如下。
1.substr_count()函数
substr_count()函数的格式为:
int substr_count ( string haystack, string needle [, int offset [, int length]] )
substr_count()函数用来统计一个字符串needle在另一个字符串haystack中出现的次数。该函数返回值是一个整数。有两个可选参数:offset和length,分别表示要查找的起点和长度。值得注意的是,offset是从0开始计算,而不是从1开始计算的。
1: <!--文件8-7.php:用substr_count函数统计字符串出现次数-->
2: <HTML>
3: <HEAD>
4: <TITLE>用substr_count函数统计字符串出现次数</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $str="I am an abstract about abroad.";
9: echo substr_count($str,"ab");
10: echo ",";
11: echo substr_count($str,"ab",6,4);
12: ?>
13: </BODY>
14: </HTML>
本例的输出结果为“3,1”。
substr_count($str,"ab")的作用是返回字符串"ab"在字符串$str中的次数,由于"ab"在整个字符串中出现了三次,因此值为3。
substr_count($str,"ab",6,4)的作用是返回字符串"ab"在$str中的从第6个字符开始(包含第6个字符,而且从0开始计算),往后数4个字符为止(即第9个字符)之间的字符串中出现的次数。这个描述看起来非常拗口和难懂。不妨换一种描述方法:参数“6,4”限定了查找字符串的范围。不指定参数时,substr_count函数从整个字符串$str中查找"ab"的出现次数,而指定了参数之后,substr_count函数从指定的范围内查找"ab"的出现次数。这个范围就是从字符串的第6个字符开始到第9个字符为止的4个字符。具体到本例中,就是"n ab"(注意n和a之间的一个空格也算一个字符)。显然,在这个范围内,"ab"只出现了一次,因此返回1。
2.strrpos()函数和strpos()函数
strrpos()函数的格式为:
int strrpos ( string haystack, mixed needle [, int offset] )
该函数返回字符needle在字符串haystack中最后一次出现的位置。这里needle只能是一个字符,而不能是一个字符串。如果提供一个字符串,PHP也只会取字符串的第一个字符,其他字符无效。参数offset也是用来限制查找的范围。
strrpos()函数的格式为:
int strpos ( string haystack, mixed needle [, int offset] )
该函数与strrpos函数仅一字之差,但功能相差很大。strpos()函数中的needle参数允许使用一个字符串,而且返回的是这个字符串在haystack中第一次出现的位置,而不是最后一次出现的位置。
1: <!--文件8-9.php:字符串查找函数的使用(一)-->
2: <HTML>
3: <HEAD>
4: <TITLE>字符串查找函数的使用(一)</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $str="I am an abstract about abroad.";
9: echo "原始字符串为:".$str."<br>";
10: echo "ab在字符串中的第一次出现位置为:".strpos($str,"ab")."<br>";
11: echo "ab在字符串中的最后一次出现位置为:".strrpos($str,"ab")."<br>";
12: echo "abcd在字符串中第一次出现的位置为:".strpos($str,"abcd");
13: ?>
14: </BODY>
15: </HTML>
本程序的运行结果如图8-8所示。
图8-8 程序8-9.php的运行结果
程序8-9.php中首先构造了一个包含多个"ab"的字符串。然后分别调用strpos和strrpos函数来获得"ab"子串在字符串中第一次和最后一次出现的位置。输出结果为8和23。这里有两点值得注意:第一点是这里的8和23都是指从0开始计算的,而且是从子串的第一个字母出现的位置开始计算。如子串为"ab",找到"ab"之后,以“a”的位置序号作为函数的返回值,而不是“b”的位置序号。第二点是如果要查找的字符串不存在,则返回布尔值false。由于false无法直接输出,因此最后查找“abcd”子串时没有任何输出。
3.strstr()函数和strrchr()函数
strstr()函数和strrchr()两个函数的格式分别是:
string strstr ( string haystack, string needle )
string strrchr ( string haystack, string needle )
由此可见,这两个函数均返回一个字符串,而不是返回一个表示位置的整数。两个函数函数名不同,使用方法完全相同,但是其作用略有不同。strstr()函数用来查找一个子串needle在字符串haystack中第一次出现的位置,并返回从此位置开始的字符串。strrchr()函数查找一个字符needle在字符串haystack中最后一次出现的位置并返回从此位置开始之后的字符串。
1: <!--文件8-10.php:字符串查找函数的使用(二)-->
2: <HTML>
3: <HEAD>
4: <TITLE>字符串查找函数的使用(二)</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $str="千山鸟飞绝,万径人踪灭,孤舟蓑笠翁,独钓寒江雪。";
9: echo "1.原始字符串为:".$str."<br>";
10: echo "用strstr函数搜索“,”的返回结果:".strstr($str,",达式").
"<br>";
11: echo "用strstr函数搜索“孤舟”的返回结果:".strstr($str,"孤舟").
"<br>";
12: $str2="I have a great dream.";
13: echo "2.原始字符串为:".$str2."<br>";
14: echo "用strrchr函数搜索"e"的返回结果:".strrchr($str2,"e").
"<br>";
15: echo "试图用strrchr函数搜索"at"的返回结果:".strrchr($str2,"at");
16: ?>
17: </BODY>
18: </HTML>
程序的运行结果如图8-9所示。
图8-9 程序8-10.php的运行结果
通过深入分析本例的输出结果,就能够准确地把握strstr和strrchr函数的功能特点。
首先,在第一个字符串中;用strstr函数搜索逗号“,”。该函数返回字符串中第一次出现“,”的位置之后的字符串。由于第一次出现逗号是在"千山鸟飞绝"的“绝”字之后,因此,函数的返回结果就是",万径人踪灭……"(注意逗号本身也会被返回)。为了证明strstr函数可以使用一个字符串而不仅仅单个字符作为参数,又在字符串中搜索“孤舟”,显然应当返回"孤舟蓑笠翁……"。和程序的运行结果相同。
然后,又构造了一个英文字母构成的字符串"I have a great dream."。用strrchr函数在字符串中查找“e”,返回字符串中最后一次出现“e”的位置之后的内容,程序中3次出现“e”,但最后一次出现是在“dream”中,于是函数返回"eam."(e本身也被返回)。最后测试是否可以把一个字符串作为参数传递给strrchr函数,在字符串中查找字符串“at”。如果该函数支持字符串参数,按照上面的分析,应当返回"at dream."。但是根据图8-9的运行结果可知,返回的却是“am.”。为什么呢?因为strrchr函数不支持字符串参数。如果提供了字符串参数,会自动截取字符串的第一个字符作为参数。也就是说参数“at”和参数“a”所起的作用一样。于是函数返回字符串中最后一次出现“a”之后的内容。也就是“am.”。
可能有读者会问,为什么要构造一个英文的字符串来讲解strrchr函数呢?通过刚才的分析就已经能够得到答案。因为每一个汉字都占两个字节,在函数中两个字节会被认为是多个字符(英文中一个字符占一个字节)。因此,strrchr函数就无法支持中文。也就是说不能把一个或多个中文字符作为参数传递给strrchr函数。
除了strrchr函数之外,PHP中还有很多函数无法直接处理中文,这里不一一列出,读者在学习PHP和编写程序时应当多加注意。
8.3.3.5 字符串替换函数
字符串替换是Web编程当中极为常用的操作,如要过滤掉用户提交的不文明的词语,或者处理掉字符串中包含的危险脚本,替换掉某些关键词等。PHP提供了一些函数来完成字符串替换操作,如nl2br()、str_replace()等。
1.nl2br()函数
该函数的名字看起来比较怪,中间包含一个数字“2”,用汉语念起来似乎有点别扭。实际上这里的“2”在英文中念“two”,与“to”谐音。这里的“2”实际上就是“to”的一种缩写。明白了这一点之后,函数名字和功能就一目了然了。在很多中文参考资料中,将此函数的功能描述为“将换行符替换成HTML的换行符<br>”,本书也沿用这一解释。但是如果查阅英文版PHP手册,会发现大意为“在每一行前插入HTML换行标记<br>”。也就是说是“插入”而不是“替换”。但是我们在使用此函数时,就其效果而言相当于“替换”,因此我们仍然采用一贯的解释,将其归为字符串替换函数。
我们通过一个简单例子来说明此函数的