自己寫一個簡單的模版引擎

來源:互聯網
上載者:User

   現在離職在家,突然發現沒什麼事兒做了,就研究研究了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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.