自己写了个:
function  csubstr($string,$start,$length) {
if(ord($string[$start])>0xa0 && ord($string[$start+1])<=0xa0) $str=$string[$start-1];
for($i=$start;$i<$length;$i++){
if(ord($string[$i])>0xa0){
$str.=$string[$i].$string[$i + 1];
$i++;
}else $str.=$string[$i];
}
return  $str;
}

解决方案 »

  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);
    }$t = "我那个csubstr只能从0截取到某个字符";
    echo c_substr($t,2);
    echo c_substr($t,2,5);
    echo c_substr($t,2,-4);
    echo c_substr($t,-5);
      

  2.   

    以前唠叨写过类似这样的函数:function mysubstr($txt, $num)
    {
    if(strlen($txt)>$num)
    {
    $txt = substr($txt, 0, $num-4) ;
    $txt .= chr(0) . "..." ;
    }
    return $txt ;
    }这么简单的没人用 请问它存在什么避端吗?
      

  3.   

    function cutstr($string,$len)
    {
           if(strlen($string)>$len) {
             for $i=0; $i<$len; $i++){
             $strcut.= ord($string[$i]>127) ? $string[$i].$string[++$i] : $string[$i];}
             return $strcut.".....";
            }else{
             return $strcut;}
    }$str='这个是discuz用的.中英文均可.但中文占两个字符.';
    cutstr($str,6)='这个是.....';
      

  4.   

    如果安装了mbstring库,可以用里面的函数
      

  5.   

    cutstr和mysubstr函数适用于简单的截断文字的场合,比如页面中的标题列表
    其实并不需要知道一个汉字是否被截断了,所以cutstr的效率就不如mysubstr了c_substr函数适用于需要精确的截取的场合,不要看他的代码较多但是效率一点都不低。
    经测试,他的运行时间是mb_substr的三倍,属于同一数量级。而且原串的长度不影响运行时间。
    而与cutstr函数一样采用逐字判断算法的函数都有运行时间随原串增长而增长的毛病