PHP中英文混合截段

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

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

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

?>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值