高效的中文字符串截取函数(徐祖宁)

原创 2004年07月03日 15:49:00

高效的中文字符串截取函数
作者:徐祖宁

在php中使用传统的字符串截取函数substr处理含有中文字符的字符串时会出现汉字被切断的现象。当可以使用php扩展库时,我们可以用mb_substr代替。但是该扩展库在连接时有一定的困难——linux下需重新编译php,有时并不能可做到,更何况其冗余函数较多。
在网络上可以看到很多实现此功能的函数。但算法多是循环判断,当字符串较大时效率极低。
为此这里介绍两个高效的函数:c_substr、m_substr。他们的用法完全与substr和mb_substr相同。不同之处在于:c_substr按字节计算,即一个汉字的长度为2;m_substr按字计算,即一个汉字的长度为1。可根据需要选用。

function c_substr($str,$start=0) {
  $ch = chr(127);
  $p = array("/[/x81-/xfe]([/x81-/xfe]|[/x40-/xfe])/","/[/x01-/x77]/");
  $r = array("","");
  if(func_num_args() > 2)
    $end = func_get_arg(2);
  else
    $end = strlen($str);
  if($start < 0)
    $start += $end;

  if($start > 0) {
    $s = substr($str,0,$start);
    if($s[strlen($s)-1] > $ch) {
      $s = preg_replace($p,$r,$s);
    $start += strlen($s);
    }
  }
  $s = substr($str,$start,$end);
  $end = strlen($s);
  if($s[$end-1] > $ch) {
    $s = preg_replace($p,$r,$s);
    $end += strlen($s);
  }
  return substr($str,$start,$end);
}

function m_substr($str,$start) {
  preg_match_all("/[/x80-/xff]?./",$str,$ar);
  if(func_num_args() >= 3) {
    $end = func_get_arg(2);
    return join("",array_slice($ar[0],$start,$end));
  }else
    return join("",array_slice($ar[0],$start));
}

性能测试:
1、使用pear的Benchmark_Iterate类作为计时器
2、以循环判断的对照函数
function TrimChinese($str,$len){
  $r_str="";
  $i=0;
  while ($i<$len){
    $ch=substr($str,$i,1);
    if(ord($ch)>0x80) $i++;
      $i++;
  }
  $r_str=substr($str,0,$i);
  return $r_str;
}
3、测试环境:p2/166、nt4 iis4+php4.3.1
4、测试代码:
require_once "Benchmark/Iterate.php";
$benchmark = new Benchmark_Iterate;

$benchmark->run(100, "TrimChinese", $str , 1000);
$result = $benchmark->get();
echo "TrimChinese:".$result[mean]."<br>";

$benchmark->run(100, "c_substr", $str , 3,1000);
$result = $benchmark->get();
echo "c_substr:".$result[mean]."<br>";

$benchmark->run(100, "m_substr", $str , 3,1000);
$result = $benchmark->get();
echo "m_substr:".$result[mean]."<br>";

$benchmark->run(100, "mb_substr", $str , 3,1000);
$result = $benchmark->get();
echo "mb_substr:".$result[mean]."<br>";
5、测试文字:本文
6、测试结果:(秒)
TrimChinese:0.058972
c_substr:0.000809
m_substr:0.000666
mb_substr:0.000458

高效的中文字符串截取函数

在php中使用传统的字符串截取函数substr处理含有中文字符的字符串时会出现汉字被切断的现象。当可以使用php扩展库时,我们可以用mb_substr代替。但是该扩展库在连接时有一定的困难——linu...
  • yuelengxin
  • yuelengxin
  • 2006年03月13日 10:10
  • 770

高效的中文字符串截取函数

 高效的中文字符串截取函数    作者:徐祖宁在php中使用传统的字符串截取函数substr处理含有中文字符的字符串时会出现汉字被切断的现象。当可以使用php扩展库时,我们可以用mb_substr代替...
  • nationzhou
  • nationzhou
  • 2004年10月13日 17:33
  • 485

实现中文字符串截取无乱码的方法

方法一:使用php内置函数mb_substr(); mb_substr( $str, $start, $length, $encoding ) $str,需要截断的字符串 $start,截断...
  • qq_27808305
  • qq_27808305
  • 2017年08月30日 21:12
  • 258

php 中文字符串截取函数

下面这二款函数是二款双字节字符串截取函数,那就是针对中文字符串截取了,好了第一款汉字中文截取函数是越级简洁了,后一款复杂但考虑更多一些。 //php教程 中文字符串截取函数 /* 下面这二款...
  • u013406691
  • u013406691
  • 2014年01月08日 15:39
  • 464

中文字符串截取函数

function str_cut_utf8($string, $length = 100, $etc = '...', $break_words = false, $middle = false) {...
  • zhoumengkang
  • zhoumengkang
  • 2013年05月07日 14:50
  • 451

PHP中文字符串截取函数

#============================================================================# 参数说明:# $fStr:需要截最的原始字...
  • sunnykobe8
  • sunnykobe8
  • 2006年05月17日 15:54
  • 661

PHP 截取字符串的函数

/** * 截取字符串的函数 * * @param string $str 被截取的字符串 * @param int $length 截取的长度 * $param str...
  • sblig
  • sblig
  • 2014年04月28日 21:47
  • 343

PHP原生--截取中文字符串,并生成省略...

PHP原生--截取中文字符串,并生成省略...
  • lamp113
  • lamp113
  • 2016年01月06日 20:38
  • 186

php 中文字符串截取的函数

//实现一个字符串截取的函数,类似于substr,必须能够截取中文这种多字节编码。假设每个中文也是一个字符,普通的数字、符号、字母也是一个字符。(提示:GB编码的中文 字符高位范围是 0x8...
  • lifushan123
  • lifushan123
  • 2015年04月04日 23:38
  • 254

rails下中文字符串截取的函数

truncate Module ActionView::Helpers::TextHelper In: vendor/rails/actionpack/lib/ac...
  • dazhi_100
  • dazhi_100
  • 2013年09月16日 21:25
  • 2485
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高效的中文字符串截取函数(徐祖宁)
举报原因:
原因补充:

(最多只允许输入30个字)