***PHP各種編碼的漢字字串擷取

suboysugar發表於2015-07-31

雖然PHP有現成的擷取字串函式substr(),但是這個函式不能對漢字字串進行擷取,要實現這種效果還需要我們自己去編寫相應的函式。漢字有多種編碼,比如GB2312,UTF-8等,漢字字串的擷取需要區分這種漢字編碼,下面是給出的幾個解決方案。

擷取GB2312中文字串

<?php
//擷取中文字串-
function mysubstr($str, $start, $len) {
    $tmpstr = "";
    $strlen = $start + $len;
    for($i = 0; $i < $strlen; $i++) {
        if(ord(substr($str, $i, 1)) > 0xa0) {
            $tmpstr .= substr($str, $i, 2);
            $i++;
        } else
            $tmpstr .= substr($str, $i, 1);
    }
    return $tmpstr;
}
?>

擷取utf8編碼的多位元組字串

<?php
//擷取utf8字串
function utf8Substr($str, $from, $len)
{
    return preg_replace(`#^(?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,`.$from.`}`.
                       `((?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,`.$len.`}).*#s`,
                       `$1`,$str);
}
?>

UTF-8、GB2312都支援的漢字擷取函式

<?php
/*
Utf-8、gb2312都支援的漢字擷取函式
cut_str(字串, 擷取長度, 開始長度, 編碼);
編碼預設為 utf-8
開始長度預設為 0
*/function cut_str($string, $sublen, $start = 0, $code = `UTF-8`)
{
    if($code == `UTF-8`)
    {
       $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]/";
        preg_match_all($pa, $string, $t_string);        if(count($t_string[0]) - $start > $sublen) return join(``, array_slice($t_string[0], $start, $sublen))."...";
        return join(``, array_slice($t_string[0], $start, $sublen));
    }
    else
    {
        $start = $start*2;
        $sublen = $sublen*2;
        $strlen = strlen($string);
        $tmpstr = ``;        for($i=0; $i<$strlen; $i++)
        {
            if($i>=$start && $i<($start+$sublen))
            {
                if(ord(substr($string, $i, 1))>129)
                {
                    $tmpstr.= substr($string, $i, 2);
                }
                else
                {
                    $tmpstr.= substr($string, $i, 1);
                }
            }
            if(ord(substr($string, $i, 1))>129) $i++;
        }
        if(strlen($tmpstr)<$strlen ) $tmpstr.= "...";
        return $tmpstr;
    }
}
$str = "abcd需要擷取的字串";
echo cut_str($str, 8, 0, `gb2312`);
?> 

BugFree 的字元擷取函式

<?php
/**
* @package     BugFree
* @version     $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $
*
*
* Return part of a string(Enhance the function substr())
*
* @author                  Chunsheng Wang <[email]wwccss@263.net[/email]>
* @param string $String the string to cut.
* @param int     $Length the length of returned string.
* @param booble $Append whether append "...": false|true
* @return string           the cutted string.
*/
function sysSubStr($String,$Length,$Append = false)
{
    if (strlen($String) <= $Length )
    {
        return $String;
    }
    else
    {
        $I = 0;
        while ($I < $Length)
        {
            $StringTMP = substr($String,$I,1);
            if ( ord($StringTMP) >=224 )
            {
                $StringTMP = substr($String,$I,3);
                $I = $I + 3;
            }
            elseif( ord($StringTMP) >=192 )
            {
                $StringTMP = substr($String,$I,2);
                $I = $I + 2;
            }
            else
            {
                $I = $I + 1;
            }
            $StringLast[] = $StringTMP;
        }
        $StringLast = implode("",$StringLast);
        if($Append)
        {
            $StringLast .= "...";
        }
        return $StringLast;
    }
}
$String = "www.nowamagic.net";
$Length = "18";
$Append = false;
echo sysSubStr($String,$Length,$Append);
?>

如何聯絡我:【萬里虎】www.bravetiger.cn
【QQ】3396726884 (諮詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/


相關文章