![PHP 7+MySQL 8动态网站开发从入门到精通(视频教学版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/141/36862141/b_36862141.jpg)
5.3 字符串的基本操作
字符串的基本操作主要包括对字符串的格式化处理、连接切分字符串、比较字符串、字符串子串的对比与处理等。
5.3.1 手动和自动转义字符串中的字符
手动转义字符串数据就是在引号(包括单引号和双引号)内通过“\”(反斜杠)使一些特殊字符转义为普通字符。在介绍单引号和双引号的时候已经对这个方法进行了详细的描述。
自动转义字符串的字符是通过PHP的内置函数addslashes()来完成的。还原这个操作则是通过调用stripslashes()函数来完成的。以上两个函数也经常用于格式化字符串中,以用于MySQL的数据库存储。
5.3.2 计算字符串的长度
计算字符串的长度经常在很多应用中出现,比如在输入框输入文字的长度就会用到此功能。调用strlen()函数就可以实现这个功能。
strlen()函数返回字符串所占的字节长度,一个英文字母、数字、各种符号均占一个字节,它们的长度均为1。一个中文字符占两个字节,所以一个中文字符的长度是2。以下实例介绍计算字符串长度的方法和技巧。
【例5.4】(实例文件:源文件\ch05\5.4.php)
<?php echo strlen("http://www.php.net/"); echo "<br"; echo strlen("山际见来烟,竹中窥落日。"); ?>
本程序的运行结果如图5-4所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P99_11514.jpg?sign=1739288063-bmaBvbSiPy4CiXhsHRSK6wd4jp77HTtw-0-65283e5ddefd0637cb0370a19f752d69)
图5-4 程序的运行结果
提 示
中文字符串"山际见来烟,竹中窥落日。"中明明是10个汉字和2个标点符号,为什么查询结果中的字符串的长度是36?原因是strlen()在计算时,对于一个UTF-8的中文字符,会把一个汉字的长度当作3个字节计算,所以"山际见来烟,竹中窥落日。"中总共有12个字符,长度为36。
当出现中英文混排的情况时,怎么准确地计算字符串的长度呢?这里需要调用另一个函数mb_strlen()。mb_strlen()函数的用法与strlen()几乎一模一样,只是多了一个指定字符集编码的参数。
mb_strlen()函数的语法格式如下:
int mb_strlen(string string_input, string encode);
PHP内置的字符串长度使函数strlen()无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在UTF-8编码下,一个汉字占3个字节)。
下面的案例将准确计算出中文字符串的长度。
【例5.5】(实例文件:源文件\ch05\5.5.php)
<?php echo strlen("山际见来烟,竹中窥落日。"); echo "<br>"; echo mb_strlen("山际见来烟,竹中窥落日。","UTF8"); ?>
本程序的运行结果如图5-5所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P100_11614.jpg?sign=1739288063-jP3Hn21OOKdhVJYEuSkzGXXvhLJfhvFp-0-d47a7050b718bc50066198d8cc5d172e)
图5-5 程序的运行结果
【案例分析】
(1)strlen()计算时,对待UTF-8的中文字符长度是3,所以“山际见来烟,竹中窥落日。”的长度为12×3=36。
(2)mb_strlen()计算时,选定的编码为UTF8,将一个中文字符当作长度1来计算,所以“山际见来烟,竹中窥落日。”的长度为12×1=12。
5.3.3 字符串中单词的统计
有时对字符串的单词进行统计有很大意义。调用str_word_count()函数可以实现此操作,但是这个函数只对基于ASCII码的英文单词起作用,对UTF-8编码的中文字符并不起作用。
下面通过实例介绍字符串单词统计中的应用和技巧。
【例5.6】(实例文件:源文件\ch05\5.6.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P100_56878.jpg?sign=1739288063-GUgmU2UPGQ2tDYkHgSIpRTM7sTeYhIv2-0-9dd3a676c05089467fecf16693e50818)
本程序的运行结果如图5-6所示。可见str_word_count()函数无法计算中文字符,查询结果为0。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P100_11615.jpg?sign=1739288063-efiGRFgxtmDYXSxiJLmdrEmJiPreVcXJ-0-8f7f4dec308a6570ca24707843d1c9b2)
图5-6 程序的运行结果
5.3.4 清理字符串中的空格
空格在很多情况下是不必要的,所以清除字符串中的空格显得十分重要。比如在判定输入是否正确的程序中,出现不必要的空格将增大程序出现错误判断的概率。
清除空格要用到ltrim()、rtrim()和trim()函数。其中,ltrim()是从左边清除字符串头部的空格,rtrim()是从右边清除字符串尾部的空格,trim()是从字符串两边同时去除头部和尾部的空格。
以下实例介绍去除字符串中空格的方法和技巧。
【例5.7】(实例文件:源文件\ch05\5.7.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P101_56879.jpg?sign=1739288063-IMR0JBhAQsxQuW0QXJjdM7m3Ya5yqmlu-0-0fca0846b70e80027afa713df28315b4)
本程序的运行结果如图5-7所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P101_11723.jpg?sign=1739288063-5MCqJUko1zUTlHjSWRYrmH1F8pJu161t-0-01fb4fed3b80b47a0bb45ba47fb329da)
图5-7 程序的运行结果
【案例分析】
(1)其中,$aa为一个两端都有空格的字符串变量。调用ltrim($aa)从左边去除空格,调用rtrim($someinput)从右边去除空格,调用trim($aa)从两边同时去除。
(2)其中,$bb为一个两端都有空格、中间也有空格的字符串变量。调用trim($bb)进行处理,只是去除两边的空格。
5.3.5 字符串的切分与组合
字符串的切分调用explode()和strtok()函数。切分的反向操作为组合,调用implode()和join()函数。其中,explode()函数把字符串切分成不同部分后存入一个数组,impolde()函数把数组中的元素按照一定的间隔组合成一个字符串。
以下实例介绍字符串切分和组合的方法和技巧。
【例5.8】(实例文件:源文件\ch05\5.8.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P101_56881.jpg?sign=1739288063-5DDUknjWRmbGN2UltC9DlpFdyl50Femd-0-3ff52ca807a0f82fd6329a740b80fec8)
本程序的运行结果如图5-8所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P102_11826.jpg?sign=1739288063-LuP4La1CAf2rOoaTonohuYo2LrZicyBI-0-a46944c266599dbbb338fc5aad90cd41)
图5-8 程序的运行结果
【案例分析】
(1)explode()函数把$aa和$bb按照下画线和空格的位置分别切分成$cc和$dd两个数组。
(2)implode()函数把$cc和$dd两个数组的元素分别按照“>”和“*”为间隔组合成新的字符串。
5.3.6 字符串中子串的截取
从一个字符串中截取一个子串就是字符串的截取操作。
完成这个操作需要用到substr()函数。这个函数有3个参数,分别规定了目标字符串、起始位置和截取长度。它的格式如下:
substr(目标字符串,起始位置,截取长度)
其中,目标字符串是某个字符串变量的变量名,起始位置和截取长度都是整数。
如果所有参数都是正数,起始位置的整数必须小于截取长度的整数,否则函数返回值为假(false)。
如果截取长度为负数,则意味着是从目标字符串结尾算起去掉截取长度数字符之后剩下的所有字符。
以下实例介绍字符串截取的方法和技巧。
【例5.9】(实例文件:源文件\ch05\5.9.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P102_56885.jpg?sign=1739288063-9aluHX4UgFFBK30OxAMM6pAxfXgbvHU8-0-5d68d4d4fb55279f6e8f5db063449d64)
本程序的运行结果如图5-9所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P103_11904.jpg?sign=1739288063-SoTCWRuADfNzqiOD01qWkd5QPtvgWDJn-0-860e960d68b0a28554157c4391b45523)
图5-9 程序的运行结果
【案例分析】
(1)$aa为英文字符串变量。substr($aa,0,11)和substr($aa,1,15)展示了起始位置和截取长度的作用。substr($aa,0,-2)则是从目标字符串尾部算起,去掉最后两个字符,剩下的所有字符都作为截取出来的子字符串。
(2)$bb为中文字符串变量。因为UTF-8编码的中文字符长度是3,所以截取12和9的长度都比较正常。当截取长度为11时,因为不是3的倍数,此时将会出现问题,所以使用时要小心。
从上述案例可以看出,当字符串中有中文字符时,截取字符串时尽量不使用substr()函数。那么应该如何操作?这里建议使用mbstring扩展库的mb_substr()函数解决上述问题。
提 示
一般的服务器都没有打开php_mbstring.dll,需要在php.ini中把php_mbstring.dll打开。
mb_substr()函数的使用方法和substr()函数类似,只是在参数中多加入一个设置字符串编码的参数。
【例5.10】(实例文件:源文件\ch05\5.10.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P103_56888.jpg?sign=1739288063-M35dnabqo86xJmMthunXrPyS4GVOUUj6-0-41c39c53b863483054635c35dbe2faf8)
本程序的运行结果如图5-10所示。在mb_substr()函数中指定了UTF-8编码后,一个汉字的长度就是1。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P103_11905.jpg?sign=1739288063-igl9pMkAeClJkYz7At1NrOyki6nFQ36L-0-fff4ac6e71556118fb1340c97f7fc3bb)
图5-10 程序的运行结果
5.3.7 字符串中子串的替换
在某个字符串中替换其中某个子串是常用的应用,就像使用文本编辑器中的替换功能一样。要实现这个功能,可调用substr_replace()函数,它的格式为:
substr_replace(目标字符串,替换字符串,起始位置,替换长度)
以下实例介绍字符串中子串的替换方法和技巧。
【例5.11】(实例文件:源文件\ch05\5.11.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P104_56890.jpg?sign=1739288063-p0FN7a6rx15NwwOlcTitDIhVOdyn2zm1-0-5a7486b1e7b312784ba1083673f3a9f1)
本程序的运行结果如图5-11所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P104_11988.jpg?sign=1739288063-Hw2ngbUkGqfMwCmh6Q2D6pILzD9bq2ic-0-380b3ae877ac2975041b7a62d2f2601e)
图5-11 程序的运行结果
【案例分析】
(1)$someinput为英文字符串变量。从第三个字符开始为ID号。第一个输出是以“************”替换第三个字符开始往后的11个字符。
(2)第二个输出是用“尾号为”替换第三个字符开始往后的11个字符。
5.3.8 字符串的查找
在一个字符串中查找另一个字符串就像文本编辑器中的查找一样。要实现功能,可调用strstr()函数或stristr()函数。其格式为:
strstr(目标字符串,需查找的字符串)
如果函数找到要查找的字符或字符串,就返回从第一个查找到字符串的位置往后所有的字符串内容。
stristr()函数为不区分字母大小的查找,也就是对字母的大小写不敏感。用法与strstr()相同。
以下实例介绍字符串查找的方法和技巧。
【例5.12】(实例文件:源文件\ch05\5.12.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P104_56893.jpg?sign=1739288063-SInIQOscmpX0y80zPZXW8x5FD1axtjd2-0-be2528626b6fa5a8548bbff86d3aaafa)
本程序的运行结果如图5-12所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P105_12115.jpg?sign=1739288063-h60Q4CZ5qwVsjB2masTosY7zRo8ef6cB-0-9ae019bf74311314671f2100177cb10c)
图5-12 程序的运行结果
【案例分析】
(1)$aa为英文字符串变量。strstr($aa,"dream")区分字母大小写,所以输出找到的字符串"dream"(在目标字符串的尾部)。stristr($aa,"dream")不区分字母大小写,所以找到第一个字符串(即便是含有大写)就开始输出。
(2)$bb为中文字符串变量。strstr()函数同样对中文字符起作用。
5.3.9 字母大小写的转换
在PHP中,通过使用字母大小写转换函数可以修改字符串中字母大小写不规范的问题。常见的字母大小写转换函数如下:
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P105_56897.jpg?sign=1739288063-hkLTxwyr7QT5F9cHtU3kXCQHPQzjlQ8p-0-3353c5981577bb487563ffdf4f16741f)
【例5.13】(实例文件:源文件\ch05\5.13.php)
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P105_56898.jpg?sign=1739288063-XDgFNlBnem3DIPYysNie1idtJYjoPE3Y-0-59a3c1df82118afe6e11d8f66b72ab1e)
本程序的运行结果如图5-13所示。
![](https://epubservercos.yuewen.com/77C0CB/19549639608907506/epubprivate/OEBPS/Images/Figure-P106_12209.jpg?sign=1739288063-N2riyzG6VWnyKJQwTRRj94skOaF3Uf4T-0-5e1fbb93a082af13d666df62f963d929)
图5-13 程序的运行结果