字符串截取是一个非常常见的编程任务,而往往带中文的字符串截取会经常用到。虽然不难,但是自己写函数实现又耗费时间,这里介绍一个比较好用的字符串截取函数,能够胜任基本的需求了。
首页要知道的:
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