PHP截取UTF8字符串——人性篇
前两篇文章讲述了两种不同的方法来截取UTF8字符串,一是一一遍历截取,二是判断截取始末位置是否被截断,后者效率较前者高许多。不过两种方法计算截取后的长度均以字节计算,由此带来的结果是截取后的长度参差不齐,尤其是对于中文方块字,汉字本身的宽度通常是英文字符的两倍,以下是一组测试结果,截取长度均为15:
可以看到,截取后的长度并不能理想化,虽说长短不一有时候能造就一种差异美,不过我们仍然希望可以有一种方法来截取使得长度大小大致相当。其实也很简单,分别判断下字符是属于哪一类的,分别计算长度即OK,在习惯性的中文中,我们通常将中文计为一个字符,那么英文则可以算是半个,于是就有了以下改良的方法:
如此处理之后,就可以使截取后的字符串长度(此长度为肉眼看到的长度)大致相等,不过却不可避免的要一一遍历,因此效率和昨天讲的判断始末位置再截取相比要低得多,却也和最开始的方法大致相当。
这是最直接的思路,其实PHP还有很多强大的工具可以利用,昨天kita给我发了个邮件,我看了下,很简短的一句话,利用了正则表达式来匹配的,下面贴出代码:
此法简洁明了,但却不是一般人能想得出来的,佩服想到正则来截取的高手~
顺便一说,正则截取的效率和一一遍历差不多,10万次测试数据如下:
方法1:2.38031816483
方法2:2.17775607109
附件下载:
substr.rar 537字节
substr.rar 537字节
上一篇:三月初八月初七
加载中……



只是时间问题嗯
2011-4-9 18:05 Saturday 作者:奇遇 分类
这个看不清楚呢