加载中……加载中……
奇遇——心情随笔 » 学习笔记 » PHP截取UTF8字符串——人性篇

PHP截取UTF8字符串——人性篇

前两篇文章讲述了两种不同的方法来截取UTF8字符串,一是一一遍历截取,二是判断截取始末位置是否被截断,后者效率较前者高许多。不过两种方法计算截取后的长度均以字节计算,由此带来的结果是截取后的长度参差不齐,尤其是对于中文方块字,汉字本身的宽度通常是英文字符的两倍,以下是一组测试结果,截取长度均为15:

点击查看原图

可以看到,截取后的长度并不能理想化,虽说长短不一有时候能造就一种差异美,不过我们仍然希望可以有一种方法来截取使得长度大小大致相当。其实也很简单,分别判断下字符是属于哪一类的,分别计算长度即OK,在习惯性的中文中,我们通常将中文计为一个字符,那么英文则可以算是半个,于是就有了以下改良的方法:

点击查看原图

如此处理之后,就可以使截取后的字符串长度(此长度为肉眼看到的长度)大致相等,不过却不可避免的要一一遍历,因此效率和昨天讲的判断始末位置再截取相比要低得多,却也和最开始的方法大致相当。

这是最直接的思路,其实PHP还有很多强大的工具可以利用,昨天kita给我发了个邮件,我看了下,很简短的一句话,利用了正则表达式来匹配的,下面贴出代码:

点击查看原图

此法简洁明了,但却不是一般人能想得出来的,佩服想到正则来截取的高手~

顺便一说,正则截取的效率和一一遍历差不多,10万次测试数据如下:

方法1:2.38031816483

方法2:2.17775607109

附件下载
substr.rar 537字节
标签:

相关日志:

奇遇关注着:more »

评论:

  • 小子
    小子 2011-04-21 10:23
    正则有个缺点,最大匹配长度有限制
    • 奇遇
      奇遇 2011-04-21 11:43
      而且正则没办法把英文字符算半个@@
  • wiki
    wiki 2011-04-11 16:42
    kita醬上榜了。。
  • IM路人
    IM路人 2011-04-11 15:27
    阿狸1这则截取,我震精了~~
    • 奇遇
      奇遇 2011-04-11 20:12
      对。。正则。。这就是那个简短精悍的写法阿狸11
  • 怜惜春残
    怜惜春残 2011-04-10 12:57
    学习了..
  • 毕加波
    毕加波 2011-04-10 12:51
    哇咔咔,让彤彤画一套阿里挂上吧
  • 毕加波
    毕加波 2011-04-10 12:51
    咦?chrome下发不了表情。
    • 奇遇
      奇遇 2011-04-10 12:55
      任何浏览器下的发不了。。这个现在只是放上来说明我以后要加表情的。。
      只是时间问题嗯
  • sprityaoyao
    sprityaoyao 2011-04-10 09:25
    我正在很仔细的研究你这几个方法。我彻底淘汰了微软的东西,系统也换成了fedora,可怜我那些正版软件和很完善的PHP环境…
    • 奇遇
      奇遇 2011-04-10 12:44
      嗯,看看吧~唉。。
  • 毕加波
    毕加波 2011-04-09 21:47

    2011-4-9 18:05 Saturday 作者:奇遇 分类

    这个看不清楚呢
    • 奇遇
      奇遇 2011-04-09 23:13
      后面的分类看得清楚就好了啊~这些个不太关注的,就让他隐匿吧~
  • 毕加波
    毕加波 2011-04-09 21:46
    地板~ 哇咔咔i,奇遇又改进模板了
    • 奇遇
      奇遇 2011-04-09 23:14
      呃。。就小小改动了下嗯~
  • 海是倒过来的天
    海是倒过来的天 2011-04-09 20:52
    我表示,我看到很多 很多的。测试。。看得我头昏脑胀、
    • 奇遇
      奇遇 2011-04-09 23:13
      呃。。下次换个字眼嗯~

发表评论:

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18 阿狸19 阿狸20

引用地址:http://blog.qiyuuu.com/tb.php?sc=bce3b2&id=271