字符串处理函数-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>”。也就是说是“插入”而不是“替换”。但是我们在使用此函数时,就其效果而言相当于“替换”,因此我们仍然采用一贯的解释,将其归为字符串替换函数。
我们通过一个简单例子来说明此函数的作用。
1: <!--文件8-11.php:nl2br()函数的使用-->
2: <HTML>
3: <HEAD>
4: <TITLE>nl2br()函数的使用</TITLE>
5: </HEAD>
6: <BODY>
7: <form action="8-11.php" method="post">
8: 请输入一段包含回车的文字:<br>
9: <textarea cols="30" rows="6" name="content"></textarea>
10: <input type=submit value="提交看效果">
11: </form>
12: <?php
13: $content=$_POST["content"];
14: //如果用户输入内容不为空
15: if($content!=""){
16: echo "<hr>";
17: echo "直接输出接收到的内容:<br>";
18: echo $content;
19: echo "<br>(内容长度:".strlen($content).")<br>";
20: echo "<hr>";
21: echo "用nl2br()处理接收到的内容,然后输出:<br>";
22: echo nl2br($content);
23: echo "<br>(内容长度:".strlen(nl2br($content)).")<br>";
24: }
25: ?>
26: </BODY>
27: </HTML>
本程序首先创建了一个TextArea多行文本输入框,并要求输入一段包含回车的文字。之所以要求包含回车,就是因为nl2br()函数处理的对象就是回车。如果不包含回车就无法测试其效果。不妨输入“子丑寅卯↙辰巳午未↙申酉戌亥”,其中“↙”表示按下键盘上的回车键。这时点击“提交看效果”按钮,出现图8-10所示的运行结果。
图8-10 程序8-11.php的运行结果
通过图8-10可以清楚地看到nl2br()函数的效果。在未使用nl2br()函数对接收到的内容进行处理时,本来输入了3行内容,在网页中显示时全都连成了一行。这是因为HTML语言不识别回车换行符号,无论在HTML代码中连续输入多少个回车换行,都不会在网页上看到效果,就是因为浏览器会忽略掉HTML代码中的回车换行。用nl2br()对内容进行处理后,每一行前面都自动添加了一个“<br>”标记。这个标记就是通常用的HTML中的换行标记“<br>”,不过是写法略有不同而已。原本输入的三行内容,便正常地显示出来。
此外,通过比较nl2br()处理前和处理后的字符串长度,也可以看出此函数的工作原理。未处理之前提交的数据内容由12个汉字和两个回车换行构成,长度为12*2 2*2=28(每次按下键盘的回车键都会产生一个换行和一个回车两个字符)。而用nl2br()函数处理之后,数据内容长度变成40,增加了12字节。而12字节恰好是2个“<br>”的长度(注意br和/之间的空格也占一个字节)。因此,足以证明nl2br()函数的作用是在被处理的字符串中每一行之前插入一个“<br>”标记。它并没有替换掉任何内容。
虽然nl2br()函数的本质并没有进行替换,但在使用中,其效果等同于将回车换行符号替换为HTML换行标记。因此在不严格要求的前提下,可以称之为字符替换函数。
2.str_replace()函数
PHP提供的str_replace函数将一个字符串中的任意子串全部替换为另外一个子串,其使用格式如下:
mixed str_replace ( mixed search, mixed replace, mixed subject [, int &count] )
这个格式看起来有点复杂。简单地解释为:str_replace()函数将subject中的所有search替换成replace,并把替换的次数存放在count中,其中count参数为可选。这里的search、repalce、subject以及整个函数的返回值都是mixed类型,也就说提供的参数可以是多种类型,常用的有字符串和数组。
1: <!--文件8-12.php:字符串替换函数综合范例-->
2: <HTML>
3: <HEAD>
4: <TITLE>字符串替换函数综合范例</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: //单个字符替换
9: $str = "当所有的人[逗]离开我的时候[逗]你劝我要耐心等候[句]";
10: echo "原字符串:<b>".$str."</b><br>";
11: $str = str_replace("[","(",$str);
12: $str = str_replace("]",")",$str);
13: echo "字符替换之后:<b>".$str."</b><br>";
14: //字符串替换
15: $str = str_replace("(逗)",",",$str);
16: $str = str_replace("(句)","。",$str);
17: echo "字符串替换之后:<b>".$str."</b><br>";
18: ?>
19: </BODY>
20: </HTML>
在程序8-12.php中,构造了一个字符串,其中逗号用“[逗]”表示,句号用“[句]”表示。第10~11行分别进行了两次替换,将字符“[”、“]”分别替换成“(”、“)”。然后输出替换后的字符串。在第14~15行,又进行了两次替换,将“(逗)”替换成“,”,将“(句)”替换成“。”,然后将最终的字符串输出。本程序运行结果如图8-11所示。
图8-11 程序8-12.php的运行结果
程序8-12.php主要用到了str_replace()函数的普通字符串替换功能。str_replace()函数还可以接收一个数组参数,来实现批量的替换。将8-12.php进行修改,得到程序8-13.php
1: <!--文件8-13.php:字符串替换函数高级应用-->
2: <HTML>
3: <HEAD>
4: <TITLE>字符串替换函数高级应用</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: //单个字符替换
9: $str = "当所有的人[逗]离开我的时候[逗]你劝我要耐心等候[句]";
10: echo "原字符串:<b>".$str."</b><br>";
11: $arr1 = array("[","]");
12: $arr2 = array("(",")");
13: $str = str_replace($arr1,$arr2,$str);
14: echo "字符替换之后:<b>".$str."</b><br>";
15: //字符串替换
16: $arr3 = array("(逗)","(句)");
17: $arr4 = array(",","。");
18: $str = str_replace($arr3,$arr4,$str);
19: echo "字符串替换之后:<b>".$str."</b><br>";
20: ?>
21: </BODY>
22: </HTML>
读者可以发现,程序8-13.php在使用str_replace()函数时传递了2个数组作为参数,第1个数组按顺序存放了要被替换的字符串,第2个数组按顺序存放了要替换成的字符串。这样,不论要替换多少个字符串,只要按照顺序分别存放在2个数组中,然后调用str_repalce()函数即可完成,这样做有明显的优点,在要替换的项目很多的情况下,可以很大程度的简化程序。
本程序的运行结果与8-12.php完全相同,运行结果图可参见图8-11。
8.3.3.6 字符串截取函数
在编程中经常遇到要将一个字符串的一部分单独取出的情况,也就是字符串的截取。PHP中常用字符串截取函数有substr()等。
substr()函数的使用格式如下:
string substr ( string string, int start [, int length] )
本函数返回一个字符串中从指定位置开始指定长度的子串。参数string为原始字符串,start为截取的起始位置(从0开始计),可选参数length为要截取的长度。值得一提的是,参数start和length均可以用负数,start为负数时说明从倒数第start个字符开始取;length为负数时表示从start位置开始取,向前取length个字符结束。
1: <!--文件8-14.php:字符串的截取-->
2: <HTML>
3: <HEAD>
4: <TITLE>字符串的截取</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: //构造字符串
9: $str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
10: echo "原字符串:<b>".$str."</b><br>";
11: //按各种方式进行截取
12: $str1 = substr($str,5);
13: echo "从第5个字符开始取至最后:".$str1."<br>";
14: $str2 = substr($str,9,4);
15: echo "从第9个字符开始取4个字符:".$str2."<br>";
16: $str3 = substr($str,-5);
17: echo "取倒数5个字符:".$str3."<br>";
18: $str4 = substr($str,-8,4);
19: echo "从倒数第8个字符开始向后取4个字符:".$str4."<br>";
20: $str5 = substr($str,-8,-2);
21: echo "从倒数第8个字符开始取到倒数第2个字符为止:".$str5."<br>";
22: ?>
23: </BODY>
24: </HTML>
本程序运行结果如图8-12所示。
图8-12 程序8-14.php的运行效果
读者可以对照图8-12来分析一下整个程序的运行。通过这个例子读者应当对substr()函数有一个深入的了解。尤其是start和length两个参数的含义和使用方法,更应该熟练掌握。有一点值得注意:start参数为正数时,从0开始计数。start参数为负数时,从1开始计数。也就是说没有“倒数第0个字符”。读者可以参考本例加深理解,也可以自己动手编制一个程序来验证。
8.3.3.7 字符串分割函数
在编程中有时候需要将一个字符串按某种规则分割成多个。PHP提供了explode()、str_split()等函数来完成分割操作。下面分别介绍这2个函数。
1.explode()函数
explode()函数的格式如下:
array explode ( string separator, string string [, int limit] )
explode()函数用来将一个字符串按照某个指定的字符分割成多段,并将每段按顺序存入一个数组中。该函数的返回值就是一个数组。separator参数为分割符,可以是一个字符串,也可以是单个字符。string为要处理的字符串。参数limit为可选,如果设置了limit,则返回的数组包含最多limit个元素,最后一个元素将包含string的剩余部分。
1: <!--文件8-15.php:字符串分割-->
2: <HTML>
3: <HEAD>
4: <TITLE>explode字符串分割函数</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: //构造字符串
9: $str = "苹果,空心菜,香蕉,萝卜,大蒜,牛肉";
10: echo "原字符串:<b>".$str."</b><br>";
11: echo "1.以逗号为分割符分割字符串:<br>";
12: $arr1 = explode(",",$str);
13: echo "---$arr1[0]的值:".$arr1[0]."<br>";
14: echo "---$arr1[4]的值:".$arr1[4]."<br>";
15: echo "2.分割时指定limit参数:<br>";
16: $arr2 = explode(",",$str,3);
17: echo "---$arr2[0]的值:".$arr2[0]."<br>";
18: echo "---$arr2[2]的值:".$arr2[2]."<br>";
19: echo "---$arr2[4]的值:".$arr2[4]."<br>";
20: ?>
21: </BODY>
22: </HTML>
程序8-15.php中,定义了一个普通字符串$str。字符串中出现了多个逗号,用explode函数来分隔这个字符串,把“,”作为分割字符。在未提供limit参数的情况下,字符串被成6小段,并存入数组$arr1中。每一小段分别对应$arr[0],$arr[1]…$arr[5]。然后指定limit参数为3,再次用explode函数分隔字符串$str,这时返回的数组$arr2只包含3个元素。即$arr2[0],$arr2[1],$arr2[2]。这时$arr2[2]中存放的不是第3个逗号之前的内容,而是第2个逗号之后的所有内容。程序运行结果如图8-13所示。
图8-13 程序8-15.php的运行结果
2.str_split()函数
str_split()函数的格式为:
array str_split ( string string [, int split_length] )
str_split()函数将一个字符串以一定长度为单位分割成多段,并返回由每一段组成的数组。str_split()函数不是以某个字符串为分割依据,而是以一定长度为分割依据。参数string为要分割的字符串,可选参数length设置分割的单位长度。
<!--文件8-16.php:用str_split函数分割字符串-->
1: <HTML>
2: <HEAD>
3: <TITLE>str_split字符串分割函数</TITLE>
4: </HEAD>
5: <BODY>
6: <?php
7: //分割英文字符串
8: $str = "Quietly I leave,just as quietly I came.";
9: echo "原字符串:<b>".$str."</b><br>";
10: echo "1.以默认长度分割字符串:<br>";
11: $arr1 = str_split($str);
12: echo "---$arr1[0]的值:".$arr1[0]."<br>";
13: echo "---$arr1[1]的值:".$arr1[1]."<br>";
14: echo "---$arr1[10]的值:".$arr1[10]."<br>";
15: echo "2.以指定长度5分割字符串:<br>";
16: $arr2 = str_split($str,5);
17: echo "---$arr2[0]的值:".$arr2[0]."<br>";
18: echo "---$arr2[1]的值:".$arr2[1]."<br>";
19: echo "---$arr2[5]的值:".$arr2[5]."<br>";
20: //测试分割中文
21: $str2="轻轻地我走了,正如我轻轻地来。";
22: echo "原字符串:<b>".$str2."</b><br>";
23: echo "1.以指定长度5分割字符串:<br>";
24: $arr3 = str_split($str2,5);
25: echo "---$arr3[0]的值:".$arr3[0]." <br>";
26: echo "---$arr3[1]的值:".$arr3[1]." <br>";
27: echo "2.以指定长度4分割字符串:<br>";
28: $arr4 = str_split($str2,4);
29: echo "---$arr4[0]的值:".$arr4[0]." <br>";
30: echo "---$arr4[1]的值:".$arr4[1]." <br>";
31: echo "---$arr4[4]的值:".$arr4[4]." <br>";
32: ?>
33: </BODY>
34: </HTML>
本程序运行结果如图8-14所示。
图8-14 程序8-16.php的运行结果
程序8-16.php中,首先构造了一个英文字符串,然后用str_split函数直接分割。分割之后字符串被一个字符一个字符的分割开来,并且将这些字符顺次存放到数组$arr1中。通过图8-15的输出结果,能够印证这一点。接下来指定分割的单位为5,这时候字符串按5个字符一段被分割成多段,并存储在数组$arr2中。这时同样可以看到正确的输出结果。
前面已经提到多次,一个汉字字符占2个字节。很多字符串处理函数对中文支持的并不好。为了测试str_split函数分割中文的效果,又构造了一个字符串,这个字符串全部由汉字字符构成。首先用5作为分割单位来分割字符串,通过输出结果可以看出,str_split函数无法区别中文,如第1段,取出的不是“轻轻地我走”5个汉字字符,而是“轻轻?”。这里为什么会有一个“?”呢?这个问号不是字符串中的,而是在分割字符串时将第3个字“地”分割成了两段,因此无法正确显示这个字符,只能显示为“?”。
为了解决这个问题,又用一个偶数4作为分割长度,这时候汉字可以正确显示,整个字符串以2个汉字字符为单位被分割成多段。也就是说,在分割中文时,分割长度必须是2的倍数,否则将会导致汉字被分成两段而无法正确显示。
纵然如此,使用函数时的分割方案还有不完美之处,那就是当一个字符串是由中英文或者中文与阿拉伯数字混合而成,那即使是用2的倍数作为分割长度,仍然无法避免汉字被分割的情况。如字符串“110是一个重要的电话号码”,如果以2或4作为分割长度,都会导致“是”这个汉字被分割。因此在使用str_split函数时必须充分考虑汉字的影响,否则会产生不可预料的结果。
关于字符串处理函数就介绍到这里。字符串处理函数在编程中使用极为频繁,读者应当熟练掌握,多多积累。本节中介绍的都是字符串处理函数中最为常用的部分,另外还有大量的函数限于篇幅无法一一介绍,读者可以参考表8-1及PHP官方手册自行学习、掌握,为后面学习深入的PHP编程打下基础。
虽然在讲解时每个函数都是独立地讲解,但读者应注意这些函数的结合使用。在一个程序中,可能会同时用到多个函数,通过多个函数的综合应用来实现一个操作,因此读者应在这方面多下功夫。
介绍几个最常用的字符串函数: 字符串输出函数 puts 格式: puts(字符数组名) 功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。 字符串输入函数 gets 格式: gets (字符数组名) 功能:从标准输入设备键盘上输入一个字符串。 字符串连接函数 strcat 格式: strcat(字符数组名1,字符数组名2) 功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。 字符串拷贝函数strcpy 格式: strcpy(字符数组名1,字符数组名2) 功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。 字符串比较函数strcmp 格式: strcmp(字符数组名1,字符数组名2) 功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。 字符串1=字符串2,返回值=0; 字符串2〉字符串2,返回值〉0; 字符串1〈字符串2,返回值〈0。 测字符串长度函数strlen 格式: strlen(字符数组名) 功能:测字符串的实际长度(不含字符串结束标志‘\0’)并作为函数返回值。