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

ThinkPHP 截取字串函數 msubstr 無法顯示省略號修正方案

     編輯:PHP 綜合知識

問題現象

ThinkPHP 內建 msubstr() 函數在字串被截斷時,未自動附加省略號(...),導致前端顯示不完整。

修正版 msubstr 函數

編輯 Common/extend.php 覆蓋原函數:

<?php
function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true) {
    // mbstring 擴展優先
    if (function_exists("mb_substr")) {
        $slice = mb_substr($str, $start, $length, $charset);
        if ($suffix && $slice !== $str) {
            return $slice . "...";
        }
        return $slice;
    }
    
    // iconv 回退
    if (function_exists('iconv_substr')) {
        $slice = iconv_substr($str, $start, $length, $charset);
        if ($suffix && $slice !== $str) {
            return $slice . "...";
        }
        return $slice;
    }
    
    // 純 PHP 正則備援(UTF-8/GB2312/GBK/BIG5)
    $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));
    
    if ($suffix && $slice !== $str) {
        return $slice . "…"; // 使用 Unicode 省略號
    }
    return $slice;
}

修正重點

原版問題修正邏輯
無條件加上省略號比較 $slice !== $str,僅在真正截斷時添加
mb_substr/iconv_substr 回傳值未判斷統一變數 $slice 判斷
正則備援編碼支援不全保留原編碼正則,補上 Unicode 省略號

使用範例

<?php
$text = "這是一段很長的測試文字,用來驗證 msubstr 函數是否正確添加省略號。";

echo msubstr($text, 0, 10);           // 輸出:這是一段很長的測...
echo msubstr($text, 0, 100);          // 輸出:完整文字(無省略號)
echo msubstr($text, 0, 10, 'utf-8', false); // 輸出:這是一段很長的測(無省略號)

效能建議

  • 生產環境務必安裝 mbstring 或 iconv 擴展,正則備援效能極差
  • 大量截取場景(如列表頁)建議在資料庫層面用 LEFT()/SUBSTRING() 或前端 CSS text-overflow: ellipsis 處理
  • ThinkPHP 5+ 內建 str_limit() / mb_strimwidth() 更推薦使用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved