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

ThinkPHP 內建字串截取函數 msubstr 完整使用指南

     編輯:PHP 相關知識

模板中直接調用

{$vo.title|msubstr=0,5,'utf-8',false}
  • 0:起始位置 (從第 0 個字元開始)
  • 5:截取長度 (5 個字元)
  • 'utf-8':字元編碼
  • false:不顯示省略號 (true 則顯示 ...)

函數簽名詳解

msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
參數說明預設值
$str要截取的字串必填
$start起始位置0
$length截取長度必填
$charset字元編碼utf-8
$suffix是否加省略號true

常見問題:無法正常調用

若提示函數不存在,需載入擴展函數庫:

// 在 Action/Controller 中載入
Load('extend');

官方版本 Bug 修正版

經測試官方版本無法正常顯示省略號,以下為修正版本 (修改 Common/extend.php):

function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) {
    if (function_exists("mb_substr")) {
        $result = mb_substr($str, $start, $length, $charset);
        return $suffix ? $result . "..." : $result;
    } elseif (function_exists('iconv_substr')) {
        $result = iconv_substr($str, $start, $length, $charset);
        return $suffix ? $result . "..." : $result;
    }
    
    // 純 PHP 實現 (無 mbstring/iconv 環境)
    $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;
}

編碼支援說明

  • UTF-8:完整支援多國語言
  • GB2312/GBK:簡體中文常用編碼
  • BIG5:繁體中文常用編碼

效能建議

  • 優先確保伺服器安裝 mbstring 擴展,效能最佳
  • 大量截取操作建議在 Controller 層預處理,避免模板重複運算
  • 固定長度截取可考慮 CSS text-overflow: ellipsis 替代
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved