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

ThinkPHP 模板字符串截取完全指南:substr 與 msubstr 實戰

     編輯:PHP 綜合知識

在 ThinkPHP 模板開發中,字符串截取是高頻需求。框架支援原生 PHP substr 並提供專門處理多字節字符的 msubstr 函數,本文詳細對比兩者用法與適用場景。

英文/單字節字符:substr


{$vo.title|substr=0,5}


{$vo.content|substr=3,10}

參數格式:|substr=起始位置,長度

  • 起始位置:0 為開頭,負數從末尾倒數
  • 長度:可選,省略則截取到結尾

中文/多字節字符:msubstr(核心推薦)

ThinkPHP 內置專門處理 UTF-8 等多字節編碼的截取函數,避免 substr 導致的亂碼問題。

函數簽名

function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true)
參數說明默認值
$str待截取字符串-
$start開始位置0
$length截取長度(字符數,非字節數)必填
$charset字符編碼utf-8
$suffix是否添加省略號true

模板調用示例


{$vo.title|msubstr=0,5,'utf-8',true}


{$vo.content|msubstr=5,10,'utf-8',false}


{$vo.title|msubstr=0,5}

實戰對比演示

進階技巧與常見問題

1. 條件截取:長度超限才截取



  {$vo.title|msubstr=0,20}

  {$vo.title}

2. 去除 HTML 標簽後再截取


{$vo.content|strip_tags|msubstr=0,50}

3. 自定義截取後綴



'TMPL_VAR_SUFFIX' => '...',  // 全局修改省略號


// 註冊自定義修飾符
function smarty_modifier_msubstr_custom($str, $len) {
    return msubstr($str, 0, $len, 'utf-8', false) . '[閱讀全文]';
}
// 模板使用
{$vo.title|msubstr_custom=20}

4. 編碼不匹配問題排查

  1. 確認數據庫/文件編碼為 UTF-8
  2. 模板文件保存為 UTF-8 無 BOM
  3. PHP 內部編碼設置:mb_internal_encoding('UTF-8')
  4. 傳遞正確 charset 參數:|msubstr=0,10,'utf-8'

性能考量

  • msubstr 內部使用 mb_substr,性能略低於 substr
  • 大量列表頁建議在控制器預處理或數據庫層面截取
  • 緩存模板編譯結果減少重複計算

總結選型表

場景推薦函數示例
純英文/數字/符號substr{$code|substr=0,8}
包含中文/日文/韓文msubstr{$title|msubstr=0,20}
混合內容(不確定)msubstr{$content|msubstr=0,100}
需要精確字節控制substr{$binary|substr=0,100}

更多模板技巧:《ThinkPHP模板操作技巧總結》、《ThinkPHP常用方法總結》

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved