UCenter Home (UCH) 採用模板與資料分離架構:PHP 邏輯層準備資料,最後 include_once template('tpl_name') 載入模板。模板檔(.htm)經解析生成 PHP 快取檔(.php),後續直接載入快取,避免重複解析。
template($name)(function_common.php)確定模板路徑與快取路徑。function_template.php 呼叫 parse_template($tpl)。parse_template 讀取 .htm,經多輪 preg_replace 將 UCH 標籤轉換為 PHP 代碼。include_once 載入執行。| 語法 | 正則模式 | 替換為 | 說明 |
|---|---|---|---|
<!--{template name}--> | /<!--\{template\s+([a-z0-9_/]+)\}-->/ie | readtemplate('name') | 包含子模板,支援三層巢狀 |
<!--{block/name}--> | /<!--\{block/(.+?)\}-->/ie | blocktags('name') | 區塊標籤,生成 <?php block('name'); ?> |
<!--{ad/name}--> | /<!--\{ad/(.+?)\}-->/ie | adtags('name') | 廣告位,生成 <?php adshow('name'); ?> |
<!--{date(expr)}--> | /<!--\{date\((.+?)\)\}-->/ie | datetags('expr') | 日期格式化,生成 <?php echo sgmdate(expr); ?> |
<!--{avatar(expr)}--> | /<!--\{avatar\((.+?)\)\}-->/ie | avatartags('expr') | 頭像輸出,生成 <?php echo avatar(expr); ?> |
<!--{eval php_code}--> | /<!--\{eval\s+(.+?)\s*\}-->/ies | evaltags('php_code') | 嵌入 PHP 代碼,s 模式跨行匹配 |
{$var} | /\\{(\$[a-zA-Z0-9_\[\]\".\x7f-\xff]+)\\}/s | <?=$var?> | 變數輸出,支援陣列嵌套 |
{if expr} | /\\{if\s+(.+?)\\}(.+?)\\{\\/if\\}/ies | stripvtags('<?php if(expr){ ?>,content<?php } ?>') | 條件判斷,stripvtags 還原變數標籤 |
{loop $arr $key} | /\\{loop\s+(\S+)\s+(\S+)\\}(.+?)\\{\\/loop\\}/ies | stripvtags('<?php if(is_array($arr)) foreach($arr as $key){ ?>,content<?php } } ?>') | 迴圈,支援 $key => $val 雙變數形式 |
$var_regexp = '((\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)'
. '(\[[a-zA-Z0-9_\-\."\'\x7f-\xff]+\])*)';
\x7f-\xff 涵蓋 UTF-8 中文字元的首位元組範圍(0xC0-0xEF 及續位元組 0x80-0xBF),使模板可直接使用中文變數名。
for ($i = 0; $i < 5; $i++) {
$template = preg_replace('/\{loop\s+(\S+)\s+(\S+)\}(.+?)\{\/loop\}/ies', ..., $template);
$template = preg_replace('/\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}(.+?)\{\/loop\}/ies', ..., $template);
}
利用正則「最左最長優先」與「貪婪/惰性」特性,由外層向內層逐層展開,最多支援 5 層巢狀(足夠實務需求)。
$template = '<?php if(!defined(IN_UCHOME)) exit("Access Denied");?>'
. '<?php subtplcheck("'.implode('|', $_SGLOBAL['sub_tpls']).'", '.$_SGLOBAL['timestamp'].', $tpl);?>'
. $template
. '<?php ob_out();?>';
IN_UCHOME 常數檢查)。subtplcheck 驗證子模板時間戳,支援模板更新自動失效。ob_out() 輸出緩衝區內容。readtemplate($name):讀取子模板內容,記錄依賴關係。blocktags/adtags/datetags/avatartags/evaltags:生成唯一標記(<!--BLOCK_TAG_1--> 等),統一在最後 str_replace 階段替換為實際 PHP 呼叫,避免巢狀替換衝突。addquote($var):將 $arr[key] 轉為 $arr['key'],修正 PHP 陣列字串鍵值未加引號的語法錯誤。stripvtags($expr, $stmt):將 <?=$var?> 還原為 $var,用於 if/loop 產生的 PHP 控制結構中。UCH 模板引擎以「正則替換 → PHP 代碼生成 → 檔案快取」為核心,語法設計簡潔且極具擴充性(區塊、廣告、日期、頭像、eval 等內建標籤),支援中文變數名、巢狀迴圈、多層模板包含,是早期 PHP MVC 框架模板引擎的典型代表。理解其原理,有助於維護舊專案或設計輕量級模板系統。