众所周知php原生函数substr是不支持截取中文字符串的。下面的代码提供了多种截取php中文字符串的方法。
1. 截取GB2312中文字符串
1 < ?php 2 //截取中文字符串 3 function mysubstr($str, $start, $len) { 4 $tmpstr = ""; 5 $strlen = $start + $len; 6 for($i = 0; $i < $strlen; $i++) { 7 if(ord(substr($str, $i, 1)) > 0xa0) { 8 $tmpstr .= substr($str, $i, 2); 9 $i++; 10 } else 11 $tmpstr .= substr($str, $i, 1); 12 } 13 return $tmpstr; 14 } 15 ?>
2. 截取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 ?>
3. UTF-8、GB2312都支持的汉字截取函数
1 < ?php 2 /* 3 Utf-8、gb2312都支持的汉字截取函数 4 cut_str(字符串, 截取长度, 开始长度, 编码); 5 编码默认为 utf-8 6 开始长度默认为 0 7 */ 8 9 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 ?>
4. BugFree 的字符截取函数
1 < ?php 2 /** 3 * @package BugFree 4 * @version $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $ 5 * 6 * 7 * Return part of a string(Enhance the function substr()) 8 * 9 * @author Chunsheng Wang <wwccss@263.net> 10 * @param string $String the string to cut. 11 * @param int $Length the length of returned string. 12 * @param booble $Append whether append "...": false|true 13 * @return string the cutted string. 14 */ 15 function sysSubStr($String,$Length,$Append = false) 16 { 17 if (strlen($String) < = $Length ) 18 { 19 return $String; 20 } 21 else 22 { 23 $I = 0; 24 while ($I < $Length) 25 { 26 $StringTMP = substr($String,$I,1); 27 if ( ord($StringTMP) >=224 ) 28 { 29 $StringTMP = substr($String,$I,3); 30 $I = $I + 3; 31 } 32 elseif( ord($StringTMP) >=192 ) 33 { 34 $StringTMP = substr($String,$I,2); 35 $I = $I + 2; 36 } 37 else 38 { 39 $I = $I + 1; 40 } 41 $StringLast[] = $StringTMP; 42 } 43 $StringLast = implode("",$StringLast); 44 if($Append) 45 { 46 $StringLast .= "..."; 47 } 48 return $StringLast; 49 } 50 } 51 52 $String = "17test.info 走在中国自动化测试的前沿"; 53 $Length = "18"; 54 $Append = false; 55 echo sysSubStr($String,$Length,$Append); 56 ?>
浙公网安备 33010602011771号