PHP字符串截取函数谁最屌

两年前的文章,整理的时候发现……

因为要设置博客边栏上的评论头像和留言,就去修改了Wordpress的源代码,正好用到了PHP的substr()函数…结果出了点小问题,在中文模式下这家伙乱码。

于是换用了PHP的mb_substr()函数,用法与substr()函数一样,需要注意的是mb_substr()函数来自mbstring extension(PHP 扩展包),网上说一般的服务器都没打开php_mbstring.dll,需要在php.ini在把php_mbstring.dll打开。

问题虽然解决了,但是substr()函数我好好Test了一番,下面是Test的步骤:

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$str\_cn = "a a我是大熊哈哈呵呵";  
echo 'substr';
for($i=0;$i<=10;$i++)
{
echo 'string('.$i.'):'.substr($str\_cn,0,$i);
echo '';
}
echo 'mb\_substr';
for($i=0;$i<=10;$i++)
{
echo 'string('.$i.'):'.mb\_substr($str\_cn,0,$i,'utf-8');
echo '';
}
echo 'mb\_strcut';
for($i=0;$i<=10;$i++)
{
echo 'string('.$i.'):'.mb\_strcut($str\_cn,0,$i,'utf-8');
echo '';
}

执行结果:

substrstring(0):
string(1):a
string(2):a
string(3):a a
string(4):a a�
string(5):a a��
string(6):a a我
string(7):a a我�
string(8):a a我��
string(9):a a我是
string(10):a a我是�

mb_substrstring(0):
string(1):a
string(2):a
string(3):a a
string(4):a a我
string(5):a a我是
string(6):a a我是大
string(7):a a我是大熊
string(8):a a我是大熊哈
string(9):a a我是大熊哈哈
string(10):a a我是大熊哈哈呵

mb_strcutstring(0):
string(1):a
string(2):a
string(3):a a
string(4):a a
string(5):a a
string(6):a a我
string(7):a a我
string(8):a a我
string(9):a a我是
string(10):a a我是

发现的细节:

  1. 在英文字符下substr()没问题,当有中文的时候就可能会出现乱码
    解决办法:1个中文字符占三个字节,所以我们可以利用这个规律。
    substr(‘我是大熊’,0,3),substr(‘我是大熊’,0,6),substr(‘我是大熊’,0,12)只要substr()的第三个参数是3的倍数就都没问题!
    这样做虽然程序的执行效率会增加(相比mb_substr()函数),但是必须要保证截取的字符串中全为中文,包括符号都要用中文模式下的符号。只有出现了一个英文字符或者符号甚至空格,都会出现乱码。所以这个方法慎用。

  2. mb_substr()函数执行效率不高,但是对中文处理很有效
    解决办法:mb_substr函数会把英文,中文,以及所有字符,空格都当作一个大的单位来对待。但是必须要指定第四个参数mb_substr(‘我是大熊’,0,3,’utf-8’),官方文档说第四个参数可以不加,但是我在测试的时候发现如果不加的话也可能会出现乱码。

  3. mb_strcut()与substr()都是按字节截取,但是mb_strcut()会判断截取最后的字符是不是一个完整的字符,如果不完整就会直接去除。所以测试中返回的结果就是显示三次。因为UTF格式等于三个字节。

分析就到此结束了。我猜测三个函数的执行效率排序如下:
substr>mb_strcut>mb_substr

substr的速度最快不用多说,mb_strcut是在substr的末尾加个判断所以效率也很高。mb_substr每次都要判断是移1位还是3位虽然对中文支持很好,但是增加服务器负担。