在 ThinkPHP 模板開發中,字符串截取是高頻需求。框架支援原生 PHP substr 並提供專門處理多字節字符的 msubstr 函數,本文詳細對比兩者用法與適用場景。
{$vo.title|substr=0,5}
{$vo.content|substr=3,10}
參數格式:|substr=起始位置,長度
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}
{$vo.title|msubstr=0,20} {$vo.title}
{$vo.content|strip_tags|msubstr=0,50}
'TMPL_VAR_SUFFIX' => '...', // 全局修改省略號
// 註冊自定義修飾符
function smarty_modifier_msubstr_custom($str, $len) {
return msubstr($str, 0, $len, 'utf-8', false) . '[閱讀全文]';
}
// 模板使用
{$vo.title|msubstr_custom=20}
mb_internal_encoding('UTF-8')|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常用方法總結》