在一个字符串中截取一个子串就是字符串截取。
完成这个操作需要用到substr()函数。这个函数有3个参数,分别规定了目标字符串、起始位置和截取长度。它的格式如下:
substr(目标字符串,起始位置,截取长度)
其中,目标字符串是某个字符串变量的变量名,起始位置和截取长度都是整数。
如果都是正数,起始位置的整数必须小于截取长度的整数,否则函数返回值为假。
如果截取长度为负数,则意味着是从起始位置开始往后、除去从目标字符串结尾算起的长度数的字符以外的所有字符。
以下实例介绍字符串截取的方法和技巧。
【例5.9】
<?php
$aa = "create a substring of this string."; //定义字符串变量$aa
$bb = "创建一个这个字符串的子串。";
echo substr($aa,0,11)."<br/>"; //截取字符串前11个字符
echo substr($aa,1,15)."<br/>"; //截取从第二个字符开始的前15个字符
echo substr($aa,0,-2)."<br/>"; //截取除最右侧两个字符外的字符
echo substr($bb,0,12)."<br/>"; //截取字符串前12个字符
echo substr($bb,0,9)."<br/>"; //截取字符串前9个字符
echo substr($bb,0,11); //截取字符串前11个字符
?>
运行结果如图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】
<?php
$aa = "时间会刺破青春表面的彩饰";
echo mb_substr($aa,0,11,"utf-8")."<br/>"; //截取字符串前11个汉字
echo mb_substr($aa,1,8,"utf-8")."<br/>"; //截取从第二个字符开始的前8个汉字
echo mb_substr($aa,0,-2,"utf-8"); //截取除最右侧两个字符外的汉字
?>
运行结果如图5-10所示。指定了UTF-8编码后,一个汉字的长度就是1。