字符串截取是一个非常常见的编程任务,而往往带中文的字符串截取会经常用到。虽然不难,但是自己写函数实现又耗费时间,这里介绍一个比较好用的字符串截取函数,能够胜任基本的需求了。
首页要知道的:
1、中文字符在gbk编码下占2个字节,在utf-8编码下占3个字节
2、ord() 函数返回字符串第一个字符的 ASCII 值
3、中文字符的ASCII值是大于0xa0。
02 | function sysSubStr( $string , $length , $append = false) |
04 | if ( strlen ( $string ) <= $length ) |
13 | $stringTMP = substr ( $string , $i ,1); |
14 | if ( ord( $stringTMP ) >=224 ) |
16 | $stringTMP = substr ( $string , $i ,3); |
19 | elseif ( ord( $stringTMP ) >=192 ) |
21 | $stringTMP = substr ( $string , $i ,2); |
28 | $stringLast [] = $stringTMP ; |
30 | $stringLast = implode( "" , $stringLast ); |
39 | $string = "简明现代魔法 —— 专注于互联网主流的各种技术" ; |
42 | echo sysSubStr( $string , $length , $append ); |
截取GB2312中文字符串:
03 | function mysubstr( $str , $start , $len ) { |
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); |
11 | $tmpstr .= substr ( $str , $i , 1); |
截取utf8编码的多字节字符串:
3 | function utf8Substr( $str , $from , $len ) |
5 | return preg_replace( '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $from . '}' . |
6 | '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $len . '}).*#s' , |
UTF-8、GB2312都支持的汉字截取函数:
09 | function cut_str( $string , $sublen , $start = 0, $code = 'UTF-8' ) |
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 ); |
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 )); |
23 | $strlen = strlen ( $string ); |
26 | for ( $i =0; $i < $strlen ; $i ++) |
28 | if ( $i >= $start && $i < ( $start + $sublen )) |
30 | if (ord( substr ( $string , $i , 1))>129) |
32 | $tmpstr .= substr ( $string , $i , 2); |
36 | $tmpstr .= substr ( $string , $i , 1); |
39 | if (ord( substr ( $string , $i , 1))>129) $i ++; |
41 | if ( strlen ( $tmpstr )< $strlen ) $tmpstr .= "..." ; |
46 | $str = "abcd需要截取的字符串" ; |
47 | echo cut_str( $str , 8, 0, 'gb2312' ); |
编码 | 字符集编码范围 |
---|
UTF8 | [\x01-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3} |
UTF16 | [\x00-\xd7][\xe0-\xff]|[\xd8-\xdf][\x00-\xff]{2} |
Big5 | [\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|[\xa1-\xfe]) |
GBK | [\x01-\x7f]|[\x81-\xfe][\x40-\xfe] |
GB2312汉字 | [\xb0-\xf7][\xa0-\xfe] |
GB2312半角标点符号及特殊符号 | \xa1[\xa2-\xfe] |
GB2312罗马数组及项目序号 | \xa2([\xa1-\xaa]|[\xb1-\xbf]|[\xc0-\xdf]|[\xe0-\xe2]|[\xe5-\xee]|[\xf1-\xfc]) |
GB2312全角标点及全角字母 | \xa3[\xa1-\xfe] |
GB2312日文平假名 | \xa4[\xa1-\xf3] |
GB2312日文片假名 | \xa5[\xa1-\xf6] |
GB18030 | [\x00-\x7f]|[\x81-\xfe][\x40-\xfe]|[\x81-\xfe][\x30-\x39][\x81-\xfe][\x30-\x39] |
JIS | [\x20-\x7e]|[\x21-\x5f]|[\x21-\x7e]{2} |
SJIS | [\x20-\x7e]|[\xa1-\xdf]|([\x81-\x9f]|[\xe0-\xef])([\x40-\x7e]|[\x80-\xfc]) |
SJIS全角空格 | (?:\x81\x81) |
SJIS全角数字 | (?:\x82[\x4f-\x58]) |
SJIS全角大写英文 | (?:\x82[\x60-\x79]) |
SJIS全角小写英文 | (?:\x82[\x81-\x9a]) |
SJIS全角平假名 | (?:\x82[\x9f-\xf1]) |
SJIS全角平假名扩展 | (?:\x82[\x9f-\xf1]|\x81[\x4a\x4b\x54\x55]) |
SJIS全角片假名 | (?:\x83[\x40-\x96]) |
SJIS全角片假名扩展 | (?:\x83[\x40-\x96]|\x81[\x45\x5b\x52\x53]) |
EUC_JP | [\x20-\x7e]|\x81[\xa1-\xdf]|[\xa1-\xfe][\xa1-\xfe]|\x8f[\xa1-\xfe]{2} |
EUC_JP标点符号及特殊字符 | [\xa1-\xa2][\xa0-\xfe] |
EUC_JP全角数字 | \xa3[\xb0-\xb9] |
EUC_JP全角大写英文 | \xa3[\xc1-\xda] |
EUC_JP全角小写英文 | \xa3[\xe1-\xfa] |
EUC_JP全角平假名 | \xa4[\xa1-\xf3] |
EUC_JP全角片假名 | \xa3[\xb0-\xb9]|\xa3[\xc1-\xda]|\xa5[\xa1-\xf6][\xa3][\xb0-\xfa]|[\xa1][\xbc-\xbe]|[\xa1][\xdd] |
EUC_JP全角汉字 | [\xb0-\xcf][\xa0-\xd3]|[\xd0-\xf4][\xa0-\xfe]|[\xB0-\xF3][\xA1-\xFE]|[\xF4][\xA1-\xA6]|[\xA4][\xA1-\xF3]|[\xA5][\xA1-\xF6]|[\xA1][\xBC-\xBE] |
EUC_JP全角空格 | (?:\xa1\xa1) |
EUC半角片假名 | (?:\x8e[\xa6-\xdf]) |
日文半角空格 | \x20 |
转自:http://www.nowamagic.net/php/php_CncharacterSubstr.php