几个汉字截取函数

作者 s, 2006 三月 30, 13:21:20

« 上一篇主题 - 下一篇主题 »

s

PHP: UTF-8兼容的substr()函数

把Nucleus改成了PHP编码后,发现一些功能,如RSS,LastComments插件等等由于要截取前...个字符做预览,结果造成了从UTF-8字符的中间截断,出现错误,这个函数可以很好的改善这个功能。

更好的实现方法当然是使用官方的mb_substr,但是需要在编译的时候指定参数,我等使用虚拟主机的只好用这个方法解决了。

<?
function utf8_substr($str,$start) {
    /*
    UTF-8 version of substr(), for people who can't use mb_substr() like me.
    Length is not the count of Bytes, but the count of UTF-8 Characters
   
    Author: Windix Feng
    Bug report to: windix(AT)gmail.com, http://www.douzi.org

    - History -
    1.0 2004-02-01 Initial Version
    2.0 2004-02-01 Use PREG instead of STRCMP and cycles, SPEED UP!
    */

preg_match_all("/[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]/", $str, $ar); 

    if(func_num_args() >= 3) {
        $end = func_get_arg(2);
        return join("",array_slice($ar[0],$start,$end));
    } else {
        return join("",array_slice($ar[0],$start));
    }
}
?>
沒了!

s

差不多的

<?
#============================================================================
# 中文字符串截取函数
# 参数说明:
# $fStr:需要截最的原始字符串;
# $fStart:从第几个汉字后开始载取,从头开始截取使用 0
# $fLen:截取几个汉字
# $fCode:原始字符串的编码方式,默认为 gb2312 或 big5,UTF-8 按 UTF-8 编码方式截取
#----------------------------------------------------------------------------
Function msubstr ($fStr, $fStart, $fLen, $fCode = "") {
    switch ($fCode) {
        case "UTF-8" :
            preg_match_all("/[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]/", $fStr, $ar);   
            if(func_num_args() >= 3) {   
                if (count($ar[0])>$fLen) {
                    return join("",array_slice($ar[0],$fStart,$fLen))."...";
                }
                return join("",array_slice($ar[0],$fStart,$fLen));
            } else {   
                return join("",array_slice($ar[0],$fStart));
            }
            break;
        default:
            $fStart = $fStart*2;
            $fLen   = $fLen*2;
            $strlen = strlen($fStr);
            for ( $i = 0; $i < $strlen; $i++ ) {
                if ( $i >= $fStart && $i < ( $fStart+$fLen ) ) {
                    if ( ord(substr($fStr, $i, 1)) > 129 ) $tmpstr .= substr($fStr, $i, 2);
                    else $tmpstr .= substr($fStr, $i, 1);
                }
                if ( ord(substr($fStr, $i, 1)) > 129 ) $i++;
            }
            if ( strlen($tmpstr) < $strlen ) $tmpstr .= "...";
            Return $tmpstr;
    }
}
?> 



使用举例:


  Code:   
<?
$a = "一二三四五六七八九十";
$b = iconv("gb2312","UTF-8",$a);
echo "a = ".msubstr($a,0,5)."
";
echo "b = ".msubstr($b,0,5,"UTF-8")."
";
?>
沒了!