字符串截取是一个非常常见的编程任务,而往往带中文的字符串截取会经常用到。虽然不难,但是自己写函数实现又耗费时间,这里介绍一个比较好用的字符串截取函数,能够胜任基本的需求了。
01 | <?php |
02 | function sysSubStr( $string , $length , $append = false) |
03 | { |
04 | if ( strlen ( $string ) <= $length ) |
05 | { |
06 | return $string ; |
07 | } |
08 | else |
09 | { |
10 | $i = 0; |
11 | while ( $i < $length ) |
12 | { |
13 | $stringTMP = substr ( $string , $i ,1); |
14 | if ( ord( $stringTMP ) >=224 ) |
15 | { |
16 | $stringTMP = substr ( $string , $i ,3); |
17 | $i = $i + 3; |
18 | } |
19 | elseif ( ord( $stringTMP ) >=192 ) |
20 | { |
21 | $stringTMP = substr ( $string , $i ,2); |
22 | $i = $i + 2; |
23 | } |
24 | else |
25 | { |
26 | $i = $i + 1; |
27 | } |
28 | $stringLast [] = $stringTMP ; |
29 | } |
30 | $stringLast = implode( "" , $stringLast ); |
31 | if ( $append ) |
32 | { |
33 | $stringLast .= "..." ; |
34 | } |
35 | return $stringLast ; |
36 | } |
37 | } |
38 | |
39 | $string = "简明现代魔法 —— 专注于互联网主流的各种技术" ; |
40 | $length = "27" ; |
41 | $append = true; |
42 | echo sysSubStr( $string , $length , $append ); |
43 |
44 | // 输出 |
45 | // 简明现代魔法 —— 专... |
46 | ?> |
截取GB2312中文字符串:
01 | <?php |
02 | //截取中文字符串 |
03 | function mysubstr( $str , $start , $len ) { |
04 | $tmpstr = "" ; |
05 | $strlen = $start + $len ; |
06 | for ( $i = 0; $i < $strlen ; $i ++) { |
07 | if (ord( substr ( $str , $i , 1)) > 0xa0) { |
08 | $tmpstr .= substr ( $str , $i , 2); |
09 | $i ++; |
10 | } else |
11 | $tmpstr .= substr ( $str , $i , 1); |
12 | } |
13 | return $tmpstr ; |
14 | } |
15 | ?> |
截取utf8编码的多字节字符串:
1 | <?php |
2 | //截取utf8字符串 |
3 | function utf8Substr( $str , $from , $len ) |
4 | { |
5 | return preg_replace( '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $from . '}' . |
6 | '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $len . '}).*#s' , |
7 | '$1' , $str ); |
8 | } |
9 | ?> |
UTF-8、GB2312都支持的汉字截取函数:
01 | <?php |
02 | /* |
03 | Utf-8、gb2312都支持的汉字截取函数 |
04 | cut_str(字符串, 截取长度, 开始长度, 编码); |
05 | 编码默认为 utf-8 |
06 | 开始长度默认为 0 |
07 | */ |
08 | |
09 | function cut_str( $string , $sublen , $start = 0, $code = 'UTF-8' ) |
10 | { |
11 | if ( $code == 'UTF-8' ) |
12 | { |
13 | $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/" ; |
14 | preg_match_all( $pa , $string , $t_string ); |
15 | |
16 | if ( count ( $t_string [0]) - $start > $sublen ) return join( '' , array_slice ( $t_string [0], $start , $sublen )). "..." ; |
17 | return join( '' , array_slice ( $t_string [0], $start , $sublen )); |
18 | } |
19 | else |
20 | { |
21 | $start = $start *2; |
22 | $sublen = $sublen *2; |
23 | $strlen = strlen ( $string ); |
24 | $tmpstr = '' ; |
25 | |
26 | for ( $i =0; $i < $strlen ; $i ++) |
27 | { |
28 | if ( $i >= $start && $i < ( $start + $sublen )) |
29 | { |
30 | if (ord( substr ( $string , $i , 1))>129) |
31 | { |
32 | $tmpstr .= substr ( $string , $i , 2); |
33 | } |
34 | else |
35 | { |
36 | $tmpstr .= substr ( $string , $i , 1); |
37 | } |
38 | } |
39 | if (ord( substr ( $string , $i , 1))>129) $i ++; |
40 | } |
41 | if ( strlen ( $tmpstr )< $strlen ) $tmpstr .= "..." ; |
42 | return $tmpstr ; |
43 | } |
44 | } |
45 | |
46 | $str = "abcd需要截取的字符串" ; |
47 | echo cut_str( $str , 8, 0, 'gb2312' ); |
48 | ?> |