現在離職在家,突然發現沒什麼事兒做了,就研究研究了smarty,寫了一個簡單的搜尋引擎。包含
assign賦值,display模版解析的方法,
建立一個MyTpl.class.php(其他名稱也可以)
代碼如下:
<?phpclass MyTpl{ //初始化函數 function __construct($template_dir='templates/',$compile_dir='templates_c'){ $this->template_dir=rtrim($template_dir,'/').'/'; $this->compile_dir=rtrim($compile_dir,'/').'/'; $this->tpl_vars=array(); } //賦值函數 function assign($tpl_var,$value=null){ if ($tpl_var!='') $this->tpl_vars[$tpl_var]=$value; } //模版解析 function display($fileName){ $tplFile=$this->template_dir.$fileName; if (!file_exists($tplFile)) return false; $comFileName=$this->compile_dir.'com_'.basename($tplFile).'.php'; if (!file_exists($comFileName)||filemtime($comFileName)<filemtime($tplFile)){ $repContent=$this->tpl_replace(file_get_contents($tplFile)); $handle=fopen($comFileName, 'w+'); fwrite($handle, $repContent); fclose($handle); } require_once $comFileName; } //模版替換函數 private function tpl_replace($content){ $pattern=array( '/<\{\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-xff]*)\s*\}>/i', //解析變數 '/<\{\s*if\s*(.+?)\s*\}>(.+?)<\{\s*\/if\s*\}>/ies', //if標籤解析 '/<\{\s*else\s*if\s*(.+?)\s*\}>/', //elseif解析 '/<\{\s*else\s*\}>/', //else解析 '/<\{\s*loop\s+\$(\S+)\s+\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*\}>(.+?)<\{\\s*\/loop\s*}>/is', //匹配loop標籤 '/<\{\s*loop\s+\$(\S+)\s+\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*=>\s*\$(\S+)\s*\}>(.+?)<\{\s*\/loop\s*\}>/is>/',//遍曆loop中的鍵和值 '/<\{\s*include\s+[\"\']?(.+?)[\"\']?\s*\}>/ie', //匹配include ); //替換成php $replacement=array( '<?php echo $this->tpl_vars["${1}"]?>', //變數替換 '$this->stripvtags(\'<?php if(${1}){?>\',\'${2}<?php}?>\')', '$this->stripvtags(\'<?php } elseif(${1}) { ?>\',"")', '<?php } else { ?>', '<?php foreach($this->tpl_vars["${1}"] as $this->tpl_vars["${2}"]) { ?>${3}<?php } ?>', '<?php foreach($this->tpl_vars["${1}"] as $this->tpl_vars["${2}"]=>$this->tpl_vars["${3}"]){?>$(4)<?php } ?>', 'file_get_contents($this->template_dir."${1}")' ); $repContent=preg_replace($pattern, $replacement, $content); if (preg_match('/<\{([^(\}>)]{1,})\}>/', $repContent)){ $repContent=$this->tpl_replace($repContent); } return $repContent; } //替換條件陳述式中對應的值 private function stripvtags($expr,$statement){ $var_pattern='/\s*\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*/is'; $expr=preg_replace($var_pattern, '$this->tpl_vars["${1}"]', $expr); $expr=str_replace("\\\"", "\"", $expr); $statement=str_replace("\\\"", "\"", $statement); return $expr.$statement; }}
以上很簡單,就是賦值,然後做模版解析以後再輸出,最複雜的一部分就是正則替換這一部分,寫了很久,有時間還是借鑒一下smarty的吧。
接下來就測試一下,建立一個inde.php
require_once 'plugins/MyTpl.class.php';$Tpl=new MyTpl();$title='第一個標題';$Tpl->assign('title',$title);$Tpl->display('index.tpl');
並且建立templates目錄,templates_c目錄其他根據實際情況來寫,然後在templates中建立一個index.tpl,寫上相應的代碼,我只是做一個簡單的測試,
<html> <head><title><{$title}></title></head> <body> <{$title}> </body></html>
然後在瀏覽器中預覽,就可以實現,我寫的正則替換裡,也包括一個loop的foreach替換標籤。大家可以繼續擴充完善,我也會繼續完善一套自己的模版引擎。
本文出自 “尛雷” 部落格,請務必保留此出處http://a3147972.blog.51cto.com/2366547/1253462