牛骨文教育服务平台(让学习变的简单)
博文笔记

PHP中英文混合截段

创建时间:2012-03-05 投稿人: 浏览次数:169

默认中文占两个英的宽度..(为解决截取中英文宽度很难一至的问题...主要为排序)

以下为处理函数..不是太佳..望高手指教

<?php

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);
}

?>


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。