截取固定长度汉字差半个字符

来源:互联网 发布:数据可视化之美 编辑:程序博客网 时间:2024/06/07 13:27
/* 截取固定长度汉字差半个字符 */
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;
    }
   }
}