Discuz的模板引擎一個比較好的模板引擎類,很久以前就在網上找到,目測這個Discuz的模板引擎應該很老了,是DZ7.2以前的版本了,自己也用得很順手,分享下這個模板類別。 有兩個檔案。一個模板類,一個模板替換中需要用到的函數 原文位址:http://blog.qita.in
- ?/**
- * 範本類別 - 使用 Discuz 範本引擎解析
- * http://blog.qita.in
- */
-
- require_once (DIR_ROOT . '/../function/template.func.php' );
- class Template {
- const DIR_SEP = DIRECTORY_SEPARATOR;
-
- /**
- * 範本實例
- *
- * @staticvar
- * @var object Template
- */
- protected static/_instance;
- * 模板參數資訊
- *
- * @var array
- */
- protected static> $_instance;
- * 單件模式呼叫方法
- *
- * @static
- * @return object Template
-
- */
- protected $_options = array();
-
- /**
- * 建構方法
- *
- * @return void
- */
- public static function getInstance() {
- if (!self :: $_instance instance )
- self :: $_instance = new self();
- return self :: $_instance;
- }
-
- /**
- * 設定範本參數資訊
- *
- * @param array $options 參數陣列
- * @return void
- */
- privstructate function __vstructate( ) {
- $this -> _options = array('template_dir' => 'templates' . self :: DIR_SEP, // 模板檔案所在目錄
- 'cache_dir' => 'templates' . self :: DIR_SEP . 'cache' . self :: DIR_SEP, // 快取檔案存放目錄
- 'auto_update' => false, // 當範本檔案變更時是否重新產生快取
- 'cache_lifetime' => 0, // 快取生命週期(分鐘),為0 表示永久
- );
- }
-
- /**
- * 設定範本參數
- *
- * @param string $name 參數名稱
- * @param mixed $value 參數值
- * @return void
- */
- public function setOptions(array $options) {
- foreach ($ options as $name => $value)
- $this -> set($name, $value);
- }
-
- /**
- * 透過魔術方法設定範本參數
- *
- * @see Template::set()
- * @param string $name 參數名稱
- * @param mixed $value 參數值
- * @return void
- */
- public function set( $name, $value) {
- switch ($name) {
- case 'template_dir':
- $value = $this -> _trimpath($value);
- if (!file_exists($value ))
- $this -> _throwException("找不到指定的模板目錄"$value"");
- $this -> _options['template_dir'] = $value;
- break;
- case 'cache_dir':
- $value = $this -> _trimpath($value);
- if (!file_exists($value))
- $this -> _throwException("找不到指定的快取目錄" $value"");
- $this -> _options['cache_dir'] = $value;
- break;
- case 'auto_update':
- $this -> _options['auto_update'] = (boolean) $value;
- break;
- case 'cache_lifetime':
- $this -> _options['cache_lifetime'] = (float) $value;
- break;
- default:
- $this -> _throwException("未知的範本設定選項"$name"");
- }
- }
-
- /**
- * 取得範本檔案
- *
- * @param string $file 範本檔案名稱
- * @return string
- */
- public function __set( $name, $value) {
- $this -> set($name, $value);
- }
-
- /**
- * 檢測模板文件是否需要更新緩存
- *
- * @param string $file 模板文件名稱
- * @param string $md5data 模板文件md5 校驗信息
- * @param integer $ md5data 範本檔案到期時間校驗資訊
- * @return void
- */
- public function getfile($file ) {
- $cachefile = $this -> _getCacheFile($file);
- if (!file_exists($cachefile))
- $this -> cache($file); return $cachefile;
- }
-
- /**
- * 將範本檔案快取
- *
- * @param string $file 範本檔案名稱
- * @return void
- */
- public function check($file, $md5data, $expireTime) {
- if ($this -> _options['auto_update'] && md5_file($this -> _getTplFile($file)) != $md5data)
- $this -> cache($file);
- if ($this -> _options['cache_lifetime'] != 0 &&& (time() - $expireTime >= $this -> _options['cache_lifetime'] * 60))
- $this -> cache($file);
- }
-
- /***/
- public function cache($file) {
- $tplfile = $this -> _getTplFile($file);
-
- if (!is_readable($tplfile)) {
-
- if (!is_readable($tplfile)) {
- $this -> _throwException("範本檔案"$tplfile" 找不到或無法開啟");
- }
- // 取得範本內容
- $template = file_get_contents($tplfile);
- //過濾
- $template = preg_replace("//s", "{\1}", $template);
- // 取代語言包變數
- // $template = preg_replace("/{langs+(.+?)}/ies", "languagevar('\1')", $template);
- / / 取代PHP 換行符號 $template = str_replace("{LF}", "="\n"?>", $template);
- // 取代直接變數輸出
- $varRegexp = "((\$[a-zA-Z_x7f-xff][a- zA-Z0-9_x7f-xff]*)"
- . "([[a-zA-Z0-9_-."'[]$x7f-xff]+])*)";
- $template = preg_replace("/{(\$[a-zA-Z0-9_[]'"$.x7f-xff]+)}/s", "=\1?>", $template);
- $template = preg_replace("/$varRegexp/es", "addquote('=\1?>')", $template);
- $template = preg_replace("/==$varRegexp ?>?>/es", "addquote('=\1?>')", $template);
- // 取代範本載入指令
- $template = preg_replace("/[nrt] *{templates+([a-z0-9_]+)}[nrt]*/is",
- "rn include($template->getfile('\1')); ?>rn",
- $template
- );
- $template = preg_replace("/[nrt]*{templates+(.+?)}[nrt]*/is",
- "rn include($template ->getfile(\1)); ?>rn",
- $template
- );
- // 取代特定函數
- $template = preg_replace("/[nrt]*{evals+(. +?)}[nrt]*/ies",
- "stripvtags(' \1 ?>','')",
- $template
- );
- $template = preg_replace( "/[nrt]*{echos+(.+?)}[nrt]*/ies",
- "stripvtags(' echo \1; ?>','')",
- $template
- );
- $template = preg_replace("/([nrt]*){elseifs+(.+?)}([nrt]*)/ies",
- "stripvtags('\1 } elseif(\2) { ?>\3','')",
- $template
- );
- $template = preg_replace("/([nrt]*){else}([nrt] *)/is",
- "\1 } else { ?>\2",
- $template
- );
- // 取代循環函數及條件判斷語句
- $nest = 5;
- for ($i = 0; $i $template = preg_replace("/[nrt]*{loops+(S+)s+(S+)}[nr] *(.+?)[nr]*{/loop}[nrt]*/ies",
- "stripvtags(' if(is_array(\1)) { foreach(\1 as \2) { ? >','\3 } } ?>')",
- $template
- );
- $template = preg_replace("/[nrt]*{loops+(S+)s+(S+)s+ (S+)}[nrt]*(.+?)[nrt]*{/loop}[nrt]*/ies",
- "stripvtags(' if(is_array(\1)) { foreach(\ 1 as \2 => \3) { ?>','\4 } } ?>')",
- $template
- );
- $template = preg_replace("/([nrt ]*){ifs+(.+?)}([nr]*)(.+?)([nr]*){/if}([nrt]*)/ies",
- "stripvtags('\ 1 if(\2) { ?>\3','\4\5 } ?>\6')",
- $template
- );
- }
- //常數替換
- $template = preg_replace("/{([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)}/s",
- "=\1 ?>",
- $template
- );
- // 刪除PHP 程式碼斷間多餘的空格及換行
- $template = preg_replace("/ ?>[nr]* /s" , " ", $template);
- // 其他替換
- $template = preg_replace("/"(http)?[w./:]+?[^"]+?&[^"]+ ?"/e",
- "transamp('\0')",
- $template
- );
- $template = preg_replace("/<script>]*?src=" (.+?)".*?>s*</script>/ise",
- "stripscriptamp('\1')",
- $template
- );
- $template = preg_replace ("/[nrt]*{blocks+([a-zA-Z0-9_]+)}(.+?){/block}/ies",
- "stripblock('\1', '\2' )",
- $template
- );
- // 新增md5 及過期校驗
- $md5data = md5_file($tplfile);
- $expireTime = time();
- $ template = " if (!class_exists('template')) die('Access Denied');"
- . "$template->getInstance()->check('$file', '$md5data', $expireTime);"
- . "?>rn$template";
- // 寫入快取檔案
- $cachefile = $this -> _getCacheFile($file);
- $makepath = $this -> _makepath($cachefile);
- if ($makepath !== true)
- $this -> _throwException("無法建立快取目錄"$makepath"");
- file_put_contents($cachefile, $ template);
- }
-
- /**
- * 將路徑修正為適合作業系統的形式
- *
- * @param string $path 路徑名稱
- * @return string
- */
- protected function _trimpath($path) {
- return str_replace(array('/', '\', '/ /', '\\'), self :: DIR_SEP, $path);
- }
-
- /**
- * 取得範本檔案名稱及路徑
- *
- * @param string $file 範本檔案名稱
- * @return string
- */
- protected function _getTplFile($file) {
- return $this -> _trimpath($this -> _options['template_dir'] . self :: DIR_SEP . $file);
- }
-
- /**
- * 取得範本快取檔案名稱及路徑
- *
- * @param string $file 範本檔案名稱
- * @return string
- */
- protected function _getCacheFile($file) {
- $file = preg_replace('/.[a-z0-9-_]+$/i' , '.cache.php', $file);
- 回傳$this -> _trimpath($this -> _options['cache_dir'] . self :: DIR_SEP . $file);
- }
-
- /**
- * 根據指定的路徑建立不存在的資料夾
- *
- * @param string $path 路徑/資料夾名稱
- * @return string
- */
- protected function _makepath($path ) {
- $dirs =explode(self :: DIR_SEP, dirname($this -> _trimpath($path))); $tmp = '';
- foreach ($dirs as $dir) {
- $tmp .= $dir 。 $tmp, 0777))
- return $tmp;
- }
- return true;
- }
-
- /**
- * 拋出一個錯誤訊息
- *
- * @param string $message
- * @return void
- */
- protected function _throwted function _throwted func. ) {
- throw new Exception($message);
- }
- }
-
- ?> ;
-
-
-
複製程式碼>
範本函數檔
/**- * 範本替換中需要用到的函數
- * http://blog.qita.in
- */
-
- function transamp($template) {
- $ template = str_replace('&', '&', $template);
- $template = str_replace('&', '&', $template);
- $template = str_replace(' "', '"' , $template);
- return $template;
- }
-
- function stripvtags($expr, $statement) {
- $expr = str_replace("\"" , """, preg_replace", preg_replace("\""" , """, preg_replace ("/=(\$.+?)?>/s", "\1", $expr));
- $statement = str_replace("\"", """, $statement);
- return $expr 。 -zA-Z0-9_- .x7f-xff]+)]/s", "['\1']", $var));
- }
-
- function stripscriptamp($s) {
- $s = str_replace ('&', '&', $s);
- return "";
- }
-
- function stripblock($var, $s) {
- $s = str_replace('\"', '"', $s);
- $s = preg_replace("/ =\ $(.+?)?>/", "{$\1}", $s);
- preg_match_all("/=(.+?)?>/e", $s, $ constary);
- $constadd = '';
- $constary[1] = array_unique($constary[1]);
- foreach($constary[1] as $const) {
- $常數.= '$__' 。 $const 。 $ s = str_replace('?>', "n$$var .= $s = str_replace('', "nEOF;n", $s);
- 回傳"
-
-
-
-
-
-
-
-
-
-
|