首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 自定義函數按字符截取 UTF-8 中文字符串:msubstr / csubstr / showShort 多版本實現

     編輯:PHP 綜合知識

版本一:簡易 msubstr(不支持起始位置)

function msubstr($str, $start, $len) {
    $strlen = $start + $len;
    $tmpstr = '';
    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;
}

假設雙字節字符高位 > 0xA0(GB2312/GBK 適用,**UTF-8 不完全適用**,中文佔 3 字節)。

版本二:完整 csubstr + showShort(支持起始、長度、截斷尾綴)

function csubstr($str, $start, $len) {
    $strlen = strlen($str);
    $clen = 0; $tmpstr = '';
    for ($i = 0; $i < $strlen; $i++, $clen++) {
        if ($clen >= $start + $len) break;
        if (ord(substr($str, $i, 1)) > 0xA0) {
            if ($clen >= $start) $tmpstr .= substr($str, $i, 2);
            $i++;
        } else {
            if ($clen >= $start) $tmpstr .= substr($str, $i, 1);
        }
    }
    return $tmpstr;
}

function showShort($str, $len) {
    $tempstr = csubstr($str, 0, $len);
    if ($str !== $tempstr) $tempstr .= "...";
    return $tempstr;
}

版本三:極簡單行代碼(利用 strlen 判斷是否超長)

$len = 19;
$text = "怎麼將新聞的很長的標題只顯示前面一些字,後面用.....來代替?";
echo strlen($text) <= $len ? $text : (substr($text, 0, $len) . chr(0) . "....");

缺陷:按字節截取,UTF-8 中文會截半個字符產生亂碼,且 chr(0) 為不可见字符。

現代最佳實踐(PHP 5.4+)

function mb_truncate($str, $length, $etc = '...') {
    if (mb_strlen($str, 'UTF-8') <= $length) return $str;
    return mb_substr($str, 0, $length, 'UTF-8') . $etc;
}
  • 使用 mb_strlen/mb_substr 正確按字符處理 UTF-8。
  • 需開啟 mbstring 擴展(現代 PHP 環境默認開啟)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved