林中侠客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

众所周知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 ?>

 

posted on 2014-11-10 15:49  林中侠客  阅读(363)  评论(0)    收藏  举报