function chn_substr($string,$start,$length="") {
    if (!is_int($length) && $length != "") {
        echo "错误:length 值错误(必须为数值)。<br>";
return false;
    } elseif ($length == "0") {
        return "";
    } else {
    $l = strlen($string);
    $a = 0;
    $ptr = 0;
    $str_list = array();
    $str_list2 = array();
    while ($a < $l) {
        $ch = substr($string,$a,1);
        $ch2 = substr($string,$a+1,1);
        if (ord($ch) >= HexDec("0x81") && ord($ch2) >= HexDec("0x40")) {
            $str_list[$ptr] = $a;
            $str_list2[$ptr] = $a+1;
            $ptr++;
            $a += 2;
        } else {
            $str_list[$ptr] = $a;
            $str_list2[$ptr] = $a;
            $ptr++;
            $a++;
        } // END IF
    } // END WHILE    if ($start > $ptr || -$start > $ptr) {
        return;
    } elseif ($length == "") {
        if ($start >= 0) { // (text,+)
            return substr($string,$str_list[$start]);
        } else { // (test,-)
            return substr($string,$str_list[$ptr + $start]);
        }
    } else {        if ($length > 0) { // $length > 0
            if ($start >= 0) {  // (text,+,+)
                if (($start + $length) >= count($str_list2)) {
                    return substr($string,$str_list[$start]);
                } else { //(text,+,+)
                    $end = $str_list2[$start + ($length - 1)] - $str_list[$start] +1;
                    return substr($string,$str_list[$start],$end);
                }            } else { // (text ,-,+)
                $start = $ptr + $start;
                if (($start + $length) >= count($str_list2)) {
                    return substr($string,$str_list[$start]);
                } else {
                    $end = $str_list2[$start + ($length - 1)] - $str_list[$start] +1;
                    return substr($string,$str_list[$start],$end);
                }
            }        } else { // $length < 0
            $end = strlen($string) - $str_list[$ptr+$length];
            if ($start >= 0) {  // (text,+,-) {
                return substr($string,$str_list[$start],-$end);
            } else { //(text,-,-)
                $start = $ptr + $start;
                return substr($string,$str_list[$start],-$end);
            }        } // END OF LENGTH > / < 0    }
    } // END IF
}

解决方案 »

  1.   

    <?php
    //给你一个函数:
    function ChgTitle($title,$length){ 
       if($length!=0){
       
       if (strlen($title)>$length) { 
        $temp = 0; 
        for($i=0; $i<$length; $i++) 
        if (ord($title[$i]) > 128) 
          $temp++; 
         if ($temp%2 == 0) 
           $title = substr($title,0,$length)."..."; 
         else 
         $title = substr($title,0,$length+1)."..."; 
        } 
        return $title; 
       
       }else{return $title;}
       
       } 
    //使用例子:
    $aaa="在我记忆的脑海里,一份独特的珍藏,一份思念的眷恋,将是我生命历程的永远回味。十年前的今天我美好幸福的人生旅途瞬间画上了句号。我由一个娇媚的少妇,变成一名独自面对一切的坚强女人,成熟女人,肩负着重大责任的女人。是人生的坎坷让我脱胎换骨。   十年前的今天,也是一双休日,天很冷,你清晨就悄悄挪出温暖的被窝。做为电视新闻工作者的你,每次的双休日很少休息,为了全市人民能看上好的电视节目,你辛勤的努力着,流下很多的汗水,直到你永远离开我后,才在你的办公桌里看到你曾经受到省,地,市级各种奖励证书三十余本。我知道你是干事业的男人
    ";
    $result=ChgTitle($aaa,40);//取40个字符,既20个汉字
    echo $result;
      

  2.   

    上面好厉害哦
    直接这样不也可以么
    $str=substr($str,0,40);//取前20个字
      

  3.   

    substr($text,0,20)
    考虑到可能是半角与全角字符共存则
    substr($text,0,20).chr(0)如果你使用php5那么事情就变的异常简单
    iconv_substr($text,0,20,'gbk')
      

  4.   

    substr()
    不能取汉字呀
    我取出来试乱码
      

  5.   

    贴个新浪网站用的subtitle函数代码
    function sub_title($title,$subnum)
    {
            $tempcount=0;
            for ($i=0;$i<$subnum;$i++)
            {
            if (ord($title[$i])>128) $tempcount++;
            }
            if (((int)($tempcount/2)*2)==$tempcount) $title=substr($title,0,$subnum);
                            else $title=substr($title,0,$subnum-1);
            return $title;
    }
      

  6.   

    上面的几位不是给了你函数吗?为什么一定要用substr呢?
      

  7.   

    我没说一定要用substr呀
    我substr取出来是乱码
    谁有更好的办法?