五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > PHP截取中文字符串(mb_substr)(截取無亂碼)和獲取截取字?jǐn)?shù)的函數(shù)

PHP截取中文字符串(mb_substr)(截取無亂碼)和獲取截取字?jǐn)?shù)的函數(shù)

文章來源:365jz.com     點擊數(shù):744    更新時間:2018-01-12 11:19   參與評論

在PHP中,substr()函數(shù)截取帶有中文字符串的話,可能會出現(xiàn)亂碼,這是因為中西文一個字節(jié)所占有的字節(jié)數(shù)不一樣,而substr的長度參數(shù)是按照字節(jié)去算的,在GB2312編碼時,一個中文占2個字節(jié),英文為1個字節(jié),而在UTF-8編碼當(dāng)中,一個中文可能占有2個或3個字節(jié),英文或半角標(biāo)點占1字節(jié)。

直接使用PHP函數(shù)substr截取中文字符可能會出現(xiàn)亂碼,主要是substr可能硬生生的將一個中文字符“鋸”成兩半。解決辦法:

1、使用mbstring擴(kuò)展庫的mb_substr截取就不會出現(xiàn)亂碼了。

2、自己書寫截取函數(shù),但效率不如用mbstring擴(kuò)展庫來得高。

3、如果僅是為了輸出截取的串,可用如下方式實現(xiàn):substr($str, 0, 30).chr(0)。

=============================

substr()函數(shù)可以分割文字,但要分割的文字如果包括中文字符往往會遇到問題,這時可以用mb_substr()/mb_strcut這個函數(shù),mb_substr()/mb_strcut的用法與substr()相似,只是在mb_substr()/mb_strcut最后要加入多一個參數(shù),以設(shè)定字符串的編碼,但是一般的服務(wù)器都沒打開php_mbstring.dll,需要在php.ini在把php_mbstring.dll打開。
舉個例子:
<?php
echo mb_substr('這樣一來我的字符串就不會有亂碼^_^', 0, 7, 'utf-8');
?>
輸出:這樣一來我的字
<?php
echo mb_strcut('這樣一來我的字符串就不會有亂碼^_^', 0, 7, 'utf-8');
?>
輸出:這樣一
從上面的例子可以看出,mb_substr是按字來切分字符,而mb_strcut是按字節(jié)來切分字符,但是都不會產(chǎn)生半個字符的現(xiàn)象。


一、中文截?。簃b_substr()

mb_substr( $str, $start, $length, $encoding )

$str,需要截斷的字符串
$start,截斷開始處,起始處為0
$length,要截取的字?jǐn)?shù)
$encoding,網(wǎng)頁編碼,如utf-8,GB2312,GBK

實例:
 
<?php 
$str='365建站網(wǎng):http://theartemis.cn'; 
echo mb_substr($str,0,5,'utf-8');//截取頭5個字,假定此代碼所在php文件的編碼為utf-8 
?> 
結(jié)果顯示:365建站


二、獲取中文長度:mb_strlen()

mb_strlen( $str, $encoding )

$str,要計算長度的字符串
$encoding,網(wǎng)頁編碼,如utf-8,GB2312,GBK

實例:
 
<?php 
$str='365建站網(wǎng):http://theartemis.cn'; 
echo mb_strlen($str,'utf-8');//假定此代碼所在php文件的編碼為utf-8 
?> 
結(jié)果顯示:27

PHP實現(xiàn)中文字串截取無亂碼的方法

function GBsubstr($string, $start, $length) {
if(strlen($string)>$length){
   $str=null;
   $len=$start+$length;
   for($i=$start;$i<$len;$i++){
    if(ord(substr($string,$i,1))>0xa0){
     $str.=substr($string,$i,2);
     $i++;
    }else{
     $str.=substr($string,$i,1);
    }
   }
   return $str.'...';
}else{
   return $string;
}
}
 
【實現(xiàn)中文字串截取無亂碼的方法--適用于utf-8】
function substr_text($str, $start=0, $length, $charset="utf-8", $suffix="")
{
if(function_exists("mb_substr")){
return mb_substr($str, $start, $length, $charset).$suffix;
}
elseif(function_exists('iconv_substr')){
return iconv_substr($str,$start,$length,$charset).$suffix;
}
$re['utf-8']  = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match);
$slice = join("",array_slice($match[0], $start, $length));
return $slice.$suffix;
}
dedecms中的截取函數(shù):
/**
*  中文截取2,單字節(jié)截取模式
*  如果是request的內(nèi)容,必須使用這個函數(shù)
*
* @access    public
* @param     string  $str  需要截取的字符串
* @param     int  $slen  截取的長度
* @param     int  $startdd  開始標(biāo)記處
* @return    string
*/
if ( ! function_exists('cn_substrR'))
{
    function cn_substrR($str, $slen, $startdd=0)
    {
        $str = cn_substr(stripslashes($str), $slen, $startdd);
        return addslashes($str);
    }
}

/**
*  中文截取2,單字節(jié)截取模式
*
* @access    public
* @param     string  $str  需要截取的字符串
* @param     int  $slen  截取的長度
* @param     int  $startdd  開始標(biāo)記處
* @return    string
*/
if ( ! function_exists('cn_substr'))
{
    function cn_substr($str, $slen, $startdd=0)
    {
        global $cfg_soft_lang;
        if($cfg_soft_lang=='utf-8')
        {
            return cn_substr_utf8($str, $slen, $startdd);
        }
        $restr = '';
        $c = '';
        $str_len = strlen($str);
        if($str_len < $startdd+1)
        {
            return '';
        }
        if($str_len < $startdd + $slen || $slen==0)
        {
            $slen = $str_len - $startdd;
        }
        $enddd = $startdd + $slen - 1;
        for($i=0;$i<$str_len;$i++)
        {
            if($startdd==0)
            {
                $restr .= $c;
            }
            else if($i > $startdd)
            {
                $restr .= $c;
            }

            if(ord($str[$i])>0x80)
            {
                if($str_len>$i+1)
                {
                    $c = $str[$i].$str[$i+1];
                }
                $i++;
            }
            else
            {
                $c = $str[$i];
            }

            if($i >= $enddd)
            {
                if(strlen($restr)+strlen($c)>$slen)
                {
                    break;
                }
                else
                {
                    $restr .= $c;
                    break;
                }
            }
        }
        return $restr;
    }
}

/**
*  utf-8中文截取,單字節(jié)截取模式
*
* @access    public
* @param     string  $str  需要截取的字符串
* @param     int  $slen  截取的長度
* @param     int  $startdd  開始標(biāo)記處
* @return    string
*/
if ( ! function_exists('cn_substr_utf8'))
{
    function cn_substr_utf8($str, $length, $start=0)
    {
        if(strlen($str) < $start+1)
        {
            return '';
        }
        preg_match_all("/./su", $str, $ar);
        $str = '';
        $tstr = '';

        //為了兼容mysql4.1以下版本,與數(shù)據(jù)庫varchar一致,這里使用按字節(jié)截取
        for($i=0; isset($ar[0][$i]); $i++)
        {
            if(strlen($tstr) < $start)
            {
                $tstr .= $ar[0][$i];
            }
            else
            {
                if(strlen($str) < $length + strlen($ar[0][$i]) )
                {
                    $str .= $ar[0][$i];
                }
                else
                {
                    break;
                }
            }
        }
        return $str;
    }
}

 

如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點擊進(jìn)入論壇

發(fā)表評論 (744人查看,0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號