天天看點

截取固定長度漢字差半個字元

/* 截取固定長度漢字差半個字元 */

 function tit($str, $length, $suffix=false ,$charset="utf-8",$conlen = false )

 {

//$length -= 1;

     $re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";

     $re['utf8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";

     $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";

     $re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";

     $re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";



$allen = (strlen($str) + mb_strlen($str,'utf-8'))/4 ;



     if($allen <= $length or !$length) return $str;



     preg_match_all($re[$charset], $str, $match);

     $c = 0;

$fv = '';

   foreach ($match[0] as $v) {

$len = strlen($v) > 1 ? 2 : 1 ;

//dump($v.'-'.$len);

$c += $len;

$fv .= $v;

    

if($c == $length*2 or $c == $length*2+1)

    

{

    

return ($suffix) ? $fv."…" : $fv;

    

break;

    

}

   }

 }      
h