[原]PHP中英文混合截取

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

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

 1 <?php
2
3 function mb_str_split($string){
4 # Split at all position not after the start: ^
5 # and not before the end: $
6 //$string = iconv('gb2312', 'utf-8//ignore', $string);
7 return preg_split('/(?<!^)(?!$)/u', $string);
8 }
9
10 $string = 'q345e q345d q345c,q345d圆钢,q345e圆钢nm360a耐磨板,欧标s355低合金板 bs700mc汽车板,汽车qste460tm结构钢,船板ah36/eh36/dh36,美标容器板 耐候钢 弹簧钢';
11 //$charlist = mb_str_split($string);
12 echo mb_chunk_split($string, 30, '..', true);
13 echo '<br>';
14 echo mb_chunk_split($string, 10, '<br>');
15
16
17 function mb_chunk_split($string, $length, $end = '..', $once = false){
18 //$string = iconv('gb2312', 'utf-8//ignore', $string);
19 $charlist = mb_str_split($string);
20 $i = 0;
21 $j = 0;
22 $once_array = array();
23 foreach($charlist as $value){
24 /* if($once){
25 if(($i + $j) > $length){
26 $i--; //尽可能少的
27 break;
28 }
29 }else{
30 if(($i + $j) >= $length){
31 $once_array[] = implode('', array_slice($charlist, $once_leng, $i));
32 $once_leng += $i;
33 $i = $j = 0;
34 }
35 } */
36
37 if(($i + $j) >= $length){
38 if($once)
39 return implode('', array_slice($charlist, 0, $i-1)) . (count($charlist) <= $i ? '' : $end);
40 $once_array[] = $i;
41 $i = $j = 0;
42 }
43
44
45 if(ord($value) > 127)
46 $j++; //中文算2个宽度
47 /*if($value == ',')
48 $j--;*/
49 $i++;
50 }
51 //末尾补齐
52 if(array_sum($once_array) < count($charlist))
53 $once_array[] = $i;
54
55 $str_arr = array();
56 $once_leng = 0;
57 foreach($once_array as $value){
58 $str_arr[] = implode('', array_slice($charlist, $once_leng, $value));
59 $once_leng += $value;
60 }
61
62 return implode($end, $str_arr);
63 //return implode('', array_slice($charlist, 0, $i)) . (count($charlist) <= $i ? '' : $end);
64 }
65
66 ?>

作者:wc1217 发表于2012-3-5 16:56:52 原文链接
阅读:5 评论:0 查看评论
posted @ 2012-03-05 16:57  无嗔  阅读(265)  评论(0编辑  收藏  举报