Interpreter Pattern (解釋器模式):為語言定義文法表示,並定義一個解釋器,用來解釋該語言中的句子。常見於模板引擎、規則引擎、SQL 解析器、正則表達式引擎。
模板內容包含特定標記(如 <!--{title}-->),解釋器識別並替換為對應資料。
<?php
class TemplateInterpreter {
private $leftDelimiter = '<!--{';
private $rightDelimiter = '}-->';
public function render(string $template, array $data): string {
// 將資料變數轉為區域變數,供 eval 上下文使用
extract($data, EXTR_OVERWRITE);
// 正則匹配標籤並替換為 PHP 輸出語句
$pattern = '/'
. preg_quote($this->leftDelimiter, '/') . '\s*'
. '(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)' // 變數名
. '\s*'
. preg_quote($this->rightDelimiter, '/')
. '/';
// 替換為
$compiled = preg_replace_callback($pattern, function($m) {
return '';
}, $template);
// 捕獲輸出
ob_start();
eval('?>' . $compiled); // 注意:eval 有安全風險,生產環境請編譯為檔案
return ob_get_clean();
}
}
// 使用範例
$tpl = new TemplateInterpreter();
$html = $tpl->render(
'歡迎 <!--{$username}-->,您的餘額:<!--{$balance}--> 元',
['username' => '張三', 'balance' => 123.45]
);
echo $html; // 輸出:歡迎 張三,您的餘額:123.45 元
擴充正則規則陣列 $rules,對應不同標籤類型:
$rules = [
// 變數輸出
'//i' => '',
// 陣列鍵值
'//i' => '',
// 任意 PHP 表達式
'//s' => '',
// PHP 語句
'//s' => '',
// 條件/迴圈需配合編譯器處理,單純正則難以正確巢狀
];
解釋器模式適合構建領域特定語言 (DSL) 或輕量模板系統。若專案需求超越簡單變數替換,請直接採用 Twig、Blade、Smarty 等成熟方案,它們本質上也是解釋器模式的工業級實現。