默默简单的写了一个模板引擎


Posted in PHP onJanuary 02, 2007

引擎文件 

<?php  
/**  
* 默默基于Discuz的模板引擎开发的OOP类模板引擎,可支持模板缓存并生成hash的md5值。由hash值来判断模板是否被修改,假如被修改则重新生成缓存文件,假如没有被修改,则直接调用缓存文件.  
* 版本:1.0.0.1 beta 测试版  
*/  
class mmtp{          var $left_tags="{";  
        var $right_tags="}";  
        var $tp_suffix=".html";  
        var $cache_suffix=".tpl";  
        var $tp_dir="./";  
        var $cache_dir="./";  
        /**  
         * 允许循环嵌套的次数,默认为5  
         *  
         * @var unknown_type  
         */  
        var $nest = 5;      
    /**  
     * 模板路径  
     *  
     * @param unknown_type $tp_dir  
     * @return mmtp  
     */  
        function __setdir($tp_dir){  
                        if(file_exists($tp_dir)){  
                                $this->tp_dir=$tp_dir;  
                        }else{  
                                $this->error("模板路径不存在");  
                        }  
        }  
        /**  
         * 设置缓存目录  
         *  
         * @param unknown_type $cache_dir  
         */  
        function __setcdir($cache_dir){  
                                if(file_exists($cache_dir)){  
                                $this->cache_dir=$cache_dir;  
                        }else{  
                                $this->error("缓存路径不存在");  
                        }  
        }  
    /**  
     * 输出错误信息  
     *  
     * @param unknown_type $msg  
     */  
        function error($msg){  
                print "<div style=\"font-size:12px;color:red;\">".$msg."</div>";  
        }  
        /**  
         * 解析模板  
         *  
         * @param unknown_type $file  
         */  
        function tp($file){  
                $tp_path=$this->tp_dir.$file.$this->tp_suffix;  
                $fp=fopen($tp_path,"rb");  
                if(!$this->file_test($tp_path,"r") && !$this->match_hash($file)){  
                        $template=$this->file_read($tp_path);  
                    $var_regexp = "((\\\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(\[[a-zA-Z0-9_\-\.\"\'\[\]\$\x7f-\xff]+\])*)";  
                    $const_regexp = "([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)";  
                        $template = preg_replace("/([\n\r]+)\t+/s", "\\1", $template);  
                        $template = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}", $template);  
                        $template = preg_replace("/\{lang\s+(.+?)\}/ies", "languagevar('\\1')", $template);  
                        $template = str_replace("{LF}", "<?=\"\\n\"?>", $template);  
                        $template = preg_replace("/\{(\\\$[a-zA-Z0-9_\[\]\'\"\$\.\x7f-\xff]+)\}/s", "<?=\\1?>", $template);  
                        $template = preg_replace("/$var_regexp/es", "\$this->addquote('<?=\\1?>')", $template);  
                        $template = preg_replace("/\<\?\=\<\?\=$var_regexp\?\>\?\>/es", "\$this->addquote('<?=\\1?>')", $template);  
                          
                        $template = preg_replace("/[\n\r\t]*\{template\s+([a-z0-9_]+)\}[\n\r\t]*/is", "\n<? include('".$this->cache_dir."\\1".$this->cache_suffix."'); ?>\n", $template);  
                        $template = preg_replace("/[\n\r\t]*\{template\s+(.+?)\}[\n\r\t]*/is", "\n<? include('".$this->cache_dir."\\1".$$this->cache_suffix."'); ?>\n", $template);  
                        $template = preg_replace("/[\n\r\t]*\{eval\s+(.+?)\}[\n\r\t]*/ies", "\$this->stripvtags('\n<? \\1 ?>\n','')", $template);  
                        $template = preg_replace("/[\n\r\t]*\{echo\s+(.+?)\}[\n\r\t]*/ies", "\$this->stripvtags('\n<? echo \\1; ?>\n','')", $template);  
                        $template = preg_replace("/[\n\r\t]*\{elseif\s+(.+?)\}[\n\r\t]*/ies", "\$this->stripvtags('\n<? } elseif(\\1) { ?>\n','')", $template);  
                        $template = preg_replace("/[\n\r\t]*\{else\}[\n\r\t]*/is", "\n<? } else { ?>\n", $template);  
                        for($i = 0; $i < $this->nest; $i++) {  
                        $template = preg_replace("/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\}[\n\r]*(.+?)[\n\r]*\{\/loop\}[\n\r\t]*/ies", "\$this->stripvtags('\n<? if(is_array(\\1)) { foreach(\\1 as \\2) { ?>','\n\\3\n<? } } ?>\n')", $template);  
                        $template = preg_replace("/[\n\r\t]*\{loop\s+(\S+)\s+(\S+)\s+(\S+)\}[\n\r\t]*(.+?)[\n\r\t]*\{\/loop\}[\n\r\t]*/ies", "\$this->stripvtags('\n<? if(is_array(\\1)) { foreach(\\1 as \\2 => \\3) { ?>','\n\\4\n<? } } ?>\n')", $template);  
                        $template = preg_replace("/[\n\r\t]*\{if\s+(.+?)\}[\n\r]*(.+?)[\n\r]*\{\/if\}[\n\r\t]*/ies", "\$this->stripvtags('\n<? if(\\1) { ?>','\n\\2\n<? } ?>\n')", $template);  
                        }  
                        $template = preg_replace("/\{$const_regexp\}/s", "<?=\\1?>", $template);  
                        $template = preg_replace("/ \?\>[\n\r]*\<\? /s", " ", $template);  
                        $hash=$this->file_hash($tp_path);  
                        $head_hash="<!-- hash=".$hash." -->";  
                        $foot_time="<!-- time=".(date("Y-m-d G:i:s"))." -->";  
                        $this->file_write($this->cache_dir.$file.".tpl",$head_hash.$template.$foot_time);  
                          
                }  
        }  
          
        /**  
         * 检查文件是否存在并且有读取权限  
         *  
         * @param unknown_type $path  
         */  
        function file_test($path,$method){  
                if(!file_exists($path) || !fopen($path,$method)){  
                        $this->error("模板文件不存在,或没有操作权限");  
                        return false;  
                }  
        }  
        /**  
         * 读取文件内容  
         *  
         * @param unknown_type $path  
         * @return unknown  
         */  
        function file_read($path,$length=0){  
                if(!$this->file_test($path,"r+")){  
                $fp=@fopen($path,"r+");  
                if($length==0){  
                        $contents=@fread($fp,filesize($path));  
                }else{  
                        $contents=@fread($fp,$length);  
                }  
                fclose($fp);  
                return $contents;  
                }  
        }  
          
        /**  
         * 写入文件内容  
         *  
         * @param unknown_type $path  
         * @param unknown_type $puts  
         */  
        function file_write($path,$puts){  
                if(!$this->file_test($path,"w+")){  
                $fp=@fopen($path,"w+");  
                @fwrite($fp,$puts);  
                fclose($fp);  
                }  
        }  
          
        /**  
         * 计算文件的hash  
         *  
         * @param unknown_type $path  
         * @return unknown  
         */  
        function file_hash($path){  
                return md5_file($path);  
        }  
          
        /**  
         * 对比模板文件与缓存文件的hash值  
         *  
         * @param unknown_type $file  
         * @return unknown  
         */  
        function match_hash($file){  
                $read_hash=$this->file_read($this->cache_dir.$file.$this->cache_suffix,46);  
                $html_hash=$this->file_hash($this->tp_dir.$file.$this->tp_suffix);  
                        if(preg_match("/".$html_hash."/i",$read_hash)){  
                        return true;  
                }  
        }  
        function addquote($var) {  
        return str_replace("\\\"", "\"", preg_replace("/\[([a-zA-Z0-9_\-\.\x7f-\xff]+)\]/s", "['\\1']", $var));  
        }  
        function transamp($str) {  
        $str = str_replace('&', '&', $str);  
        $str = str_replace('&amp;', '&', $str);  
        $str = str_replace('\"', '"', $str);  
        return $str;  
}  
        function stripvtags($expr, $statement) {  
        $expr = str_replace("\\\"", "\"", preg_replace("/\<\?\=(\\\$.+?)\?\>/s", "\\1", $expr));  
        $statement = str_replace("\\\"", "\"", $statement);  
        return $expr.$statement;  
}  
}  

$tp=new mmtp();  
$tp->__setdir("./");  
$tp->__setcdir("./cache/");  
$tp->tp("index1");  
$_GET[it]=sdhkadajksdhajdhkajsdhjkasdjkasdhasjdhkjsadhk;  
$name=2;  
$head="欢迎使用MoMo模板引擎";  
include("./cache/index1.tpl");  
?> 

模板index.html 

{$head}
 
模板index1.html
{template index}  
{if $name==1}  
你好  
{else}  
谢谢  
{/if}  

这个模板是默默今天下午写的,写的比较仓促,也许存在漏洞,这个版本只是测试版,以后我会逐渐的去完善,先发出来,当作一个前瞻.

PHP 相关文章推荐
生成缩略图
Oct 09 PHP
PHP 出现乱码和Sessions验证问题的解决方法!
Dec 06 PHP
discuz7 phpMysql操作类
Jun 21 PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
PHP Reflection API详解
May 12 PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 PHP
PHP扩展框架之Yaf框架的安装与使用
May 18 PHP
PHP二维数组去重算法
Dec 17 PHP
PHP面相对象中的重载与重写
Feb 13 PHP
详解yii2使用多个数据库的案例
Jun 16 PHP
PHP实现生成推广海报的方法详解
Mar 14 PHP
超强分页类2.0发布,支持自定义风格,默认4种显示模式
Jan 02 #PHP
PHP小技巧搜集,每个PHPer都来露一手
Jan 02 #PHP
实例(Smarty+FCKeditor新闻系统)
Jan 02 #PHP
PHP+JS无限级可伸缩菜单详解(简单易懂)
Jan 02 #PHP
PHP文件上传实例详解!!!
Jan 02 #PHP
AJAX for PHP简单表数据查询实例
Jan 02 #PHP
[原创]PHP中通过ADODB库实现调用Access数据库之修正版本
Dec 31 #PHP
You might like
PHP教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
IE图片缓存document.execCommand(&quot;BackgroundImageCache&quot;,false,true)
2011/03/01 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
解决自定义$(id)的方法与jquery选择器$冲突的问题
2014/06/14 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
2018/06/05 jQuery
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
JS回调函数深入理解
2019/10/16 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
Python中常用信号signal类型实例
2018/01/25 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
django在开发中取消外键约束的实现
2020/05/20 Python
python 将Excel转Word的示例
2021/03/02 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
2019年Java 最常见的 面试题
2016/10/19 面试题
师范应届生语文教师求职信
2013/10/29 职场文书
公司收款委托书范本
2014/09/20 职场文书
施工现场安全管理制度
2015/08/05 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android