当前访客身份:游客 [ 登录 | 加入开源中国 ]

代码分享

当前位置:
代码分享 » PHP  » 编程基础
分享到: 
收藏 +0
1
因为mb_substr、mb_strlen太过低效,故而采用了此段代码。

非原创,主要原理是根据UTF-8的编码特点
0xxxxxxx 
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
来获取字符边界,从而确定一个字所占字节数,并处理成数组。


方便对字符操作比较频繁的用户,此函数效率比mb_substr高效10倍,我曾经写过一个「N万违禁词替换类」,在开发此类过程中,详细对比过这两者的效率,此函数明显胜出。
标签: PHP

代码片段(1) [全屏查看所有代码]

1. [代码][PHP]代码     跳至 [1] [全屏预览]

function str_split_utf8($str) { 
	// place each character of the string into and array 
	$split = 1; 
	$array = array(); $len = strlen($str);
	for ( $i = 0; $i < $len; ){ 
		$value = ord($str[$i]); 
		if($value > 0x7F){ 
			if($value >= 0xC0 && $value <= 0xDF) 
				$split = 2; 
			elseif($value >= 0xE0 && $value <= 0xEF) 
				$split = 3; 
			elseif($value >= 0xF0 && $value <= 0xF7) 
				$split = 4;
			elseif($value >= 0xF8 && $value <= 0xFB) 
				$split = 5; 
			elseif($value >= 0xFC) 
				$split = 6; 
				
		} else {
			$split = 1; 
		} 
		$key = ''; 
		for ( $j = 0; $j < $split; ++$j, ++$i ) { 
			$key .= $str[$i]; 
		} 
		$array[] = $key;
	} 
	return $array; 
} 


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(3)

  • 1楼:jeffsui 发表于 2012-03-26 19:28 回复此评论
    哦,如此高效,先看看!
    新来的?
  • 2楼:TroyCheng 发表于 2014-07-21 19:29 回复此评论
    实测,这个仅比mb_substr快了一点,对于UTF-8的字符串,preg_match_all("/./u", $str, $out);这个方式是最快的。
    mb_substr,你的方式,preg_match_all三者对一段文本处理5000次的耗时(microtime(true)计时):
    cost:2.78571009636
    cost:2.32688188553
    cost:0.451366901398
  • 3楼:会员 发表于 2014-08-15 11:03 回复此评论
    $a = '很长的字符串'; 
    $size = mb_strlen($a); 
    $t= microtime(TRUE); 
    //第1次960个字 第2次3497个字 
    for($i = 0;$i < 5000;$i++) 

    //str_split_utf8($a); //3.8829998970032 //15.660999774933 

    //for($j = 0;$j < $size;$j++) 
    // mb_substr($a,$j,1,'utf-8');//60.177000045776  //2分钟都没有结束 

    //preg_match_all("/./u", $a, $out); //1.3170001506805  //6.0699999332428 

    echo microtime(TRUE) - $t; 

    有那么夸张吗?