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

UCenter Home 1.5 模板引擎原理深度剖析:從語法解析到 PHP 代碼生成

     編輯:關於C語言

架構概覽

UCenter Home (UCH) 採用模板與資料分離架構:PHP 邏輯層準備資料,最後 include_once template('tpl_name') 載入模板。模板檔(.htm)經解析生成 PHP 快取檔(.php),後續直接載入快取,避免重複解析。

核心流程

  1. template($name)(function_common.php)確定模板路徑與快取路徑。
  2. 若快取不存在,載入 function_template.php 呼叫 parse_template($tpl)。
  3. parse_template 讀取 .htm,經多輪 preg_replace 將 UCH 標籤轉換為 PHP 代碼。
  4. 寫入快取檔,返回快取路徑供 include_once 載入執行。

模板語法與替換規則

語法正則模式替換為說明
<!--{template name}-->/<!--\{template\s+([a-z0-9_/]+)\}-->/iereadtemplate('name')包含子模板,支援三層巢狀
<!--{block/name}-->/<!--\{block/(.+?)\}-->/ieblocktags('name')區塊標籤,生成 <?php block('name'); ?>
<!--{ad/name}-->/<!--\{ad/(.+?)\}-->/ieadtags('name')廣告位,生成 <?php adshow('name'); ?>
<!--{date(expr)}-->/<!--\{date\((.+?)\)\}-->/iedatetags('expr')日期格式化,生成 <?php echo sgmdate(expr); ?>
<!--{avatar(expr)}-->/<!--\{avatar\((.+?)\)\}-->/ieavatartags('expr')頭像輸出,生成 <?php echo avatar(expr); ?>
<!--{eval php_code}-->/<!--\{eval\s+(.+?)\s*\}-->/iesevaltags('php_code')嵌入 PHP 代碼,s 模式跨行匹配
{$var}/\\{(\$[a-zA-Z0-9_\[\]\".\x7f-\xff]+)\\}/s<?=$var?>變數輸出,支援陣列嵌套
{if expr}/\\{if\s+(.+?)\\}(.+?)\\{\\/if\\}/iesstripvtags('<?php if(expr){ ?>,content<?php } ?>')條件判斷,stripvtags 還原變數標籤
{loop $arr $key}/\\{loop\s+(\S+)\s+(\S+)\\}(.+?)\\{\\/loop\\}/iesstripvtags('<?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),使模板可直接使用中文變數名。

巢狀迴圈處理:固定 5 輪迭代替換

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 框架模板引擎的典型代表。理解其原理,有助於維護舊專案或設計輕量級模板系統。

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