php 中英文混合字符串的截取函数

发布时间:2019-09-16编辑:脚本学堂
分享一个php实现的截取中英文混合字符串的代码,中文默认点两个英文的宽度,本例实现了中英文混合字符串的截取方法,有需要的朋友参考下。

默认中文占两个英的宽度..(为解决截取中英文宽度很的问题,采用了字符排序)

完整代码:
 

复制代码 代码示例:

<?php 
/**
* 截取中英文混合的字符串
* by www.jb200.com
*/
function mb_str_split($string){ 
    # Split at all position not after the start: ^  
    # and not before the end: $  
    //$string = iconv('gb2312', 'utf-8//ignore', $string); 
    return preg_split('/(?<!^)(?!$)/u', $string); 
}

$string = 'q345e q345d q345c,q345d圆钢,q345e圆钢nm360a耐磨板,欧标s355低合金板 bs700mc汽车板,汽车qste460tm结构钢,船板ah36/eh36/dh36,美标容器板 耐候钢 弹簧钢'; 
//$charlist = mb_str_split($string); 
echo mb_chunk_split($string, 30, '..', true); 
echo '<br>'; 
echo mb_chunk_split($string, 10, '<br>'); 
 
function mb_chunk_split($string, $length, $end = '..', $once = false){ 
    //$string = iconv('gb2312', 'utf-8//ignore', $string);   
    $charlist = mb_str_split($string); 
    $i = 0; 
    $j = 0; 
    $once_array = array(); 
    foreach($charlist as $value){ 
        /* if($once){
          if(($i + $j) > $length){
          $i--; //尽可能少的
          break;
          }
          }else{
          if(($i + $j) >= $length){
          $once_array[] = implode('', array_slice($charlist, $once_leng, $i));
          $once_leng += $i;
          $i = $j = 0;
          }
          } */ 
 
        if(($i + $j) >= $length){ 
            if($once) 
                return implode('', array_slice($charlist, 0, $i-1)) . (count($charlist) <= $i ? '' : $end); 
            $once_array[] = $i; 
            $i = $j = 0; 
        } 
 
 
        if(ord($value) > 127) 
            $j++; //中文算2个宽度 
        /*if($value == ',')
            $j--;*/ 
        $i++; 
    } 
    //末尾补齐 
    if(array_sum($once_array) < count($charlist)) 
        $once_array[] = $i; 
 
    $str_arr = array(); 
    $once_leng = 0; 
    foreach($once_array as $value){ 
        $str_arr[] = implode('', array_slice($charlist, $once_leng, $value)); 
        $once_leng += $value; 
    } 
 
    return implode($end, $str_arr); 
    //return implode('', array_slice($charlist, 0, $i)) . (count($charlist) <= $i ? '' : $end); 
}
?>