1. 程式人生 > >PHP中字串超長的中英文混合擷取

PHP中字串超長的中英文混合擷取

在網站的建設中,很多時候都會遇到文章標題超出分割槽限制的情況,這時候需要我們擷取超出的部分,把超出部分做省略處理,這樣使用者就可以點選連結跳轉再檢視詳情了。PHP自帶的函式也可以擷取字串,例如$str|substr=a,b;這樣可以擷取字串$str的從第a位開始的b個字串,但是,很多時候文章標題中含有英文等字元,英文和漢字在儲存時所佔的空間不一樣大,我們就無法按單個儲存的位元組倍數擷取正好的字數,這樣很多那時候都會在網站中出現黑塊,字顯示不完整的情況,然後我們就需要寫一個可以中英文混合擷取的字串擷取函式。程式碼如下:
/**
 * 字串擷取,支援中文和其他編碼
 * @static
 * @access public
 * @param string $str 需要轉換的字串
 * @param string $start 開始位置
 * @param string $length 擷取長度
 * @param string $charset 編碼格式
 * @param string $suffix 截斷顯示字元
 * @return string
 */
function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) {
    if(function_exists("mb_substr"))
        $slice = mb_substr($str, $start, $length, $charset);
    elseif(function_exists('iconv_substr')) {
        $slice = iconv_substr($str,$start,$length,$charset);
        if(false === $slice) {
            $slice = '';
        }
    }else{
        $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 $suffix ? $slice.'...' : $slice;
}
我們只需要把這個函式寫到公共函式裡就可以直接使用了