SmartY 模板引擎的變量調節器(Modifier)語法看似簡單,卻藏著極易忽視的「空格陷阱」。本文還原一次真實調試過程,揭示 {$name | upper} 為何失效,而 {$name|upper} 卻正常的底層解析邏輯。
{* 模板代碼 *}
{$name | upper}
{* 輸出結果:原始值,未轉大寫 *}
檢查項目:
plugins/modifier.upper.php 存在$smarty->loadPlugin('modifier_upper') 可手動加載$name 賦值正常耗時 1 小時無果,絕望中刪除重寫:
{$name|upper}
{* 輸出:預期的大寫字符串 *}
SmartY 編譯器在解析變量調節器時,採用無空格貪婪匹配策略:
// 簡化版編譯器邏輯 (SmartY_Compiler.class.php)
if (preg_match('/^\$\w+(\s*\|\s*\w+)*$/', $token)) {
// 解析調節器鏈
} else {
// 視為普通變量輸出,忽略後續內容
}
關鍵正則:\s*\|\s* 允許管道符前後有空格,但變量名與第一個管道符之間不能有空格。
即:{$var|modifier} ✅、{$var |modifier} ❌、{$var| modifier} ✅(管道後空格允許)。
{$a - $b} 減法 vs {$a|modifier} 調節器| 作為明確分隔符| 寫法 | 結果 | 說明 |
|---|---|---|
{$var|upper} | ✅ 成功 | 標準寫法 |
{$var | upper} | ❌ 失效 | 變量名與管道符間有空格 |
{$var| upper} | ✅ 成功 | 管道符後空格被忽略 |
{$var|upper|lower} | ✅ 成功 | 鏈式調節器 |
{$var|upper:param} | ✅ 成功 | 帶參數調節器 |
{$var|@upper} | ✅ 成功 | @ 表示對整個數組應用 |