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

截取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    ?>