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

引擎文件

代码如下:

<?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}

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

(0)

相关推荐

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

    引擎文件 复制代码 代码如下: <?php  /**  * 默默基于Discuz的模板引擎开发的OOP类模板引擎,可支持模板缓存并生成hash的md5值.由hash值来判断模板是否被修改,假如被修改则重新生成缓存文件,假如没有被修改,则直接调用缓存文件.  * 版本:1.0.0.1 beta 测试版  */  class mmtp{ var $left_tags="{";          var $right_tags="}";          var $

  • 自定义min版smarty模板引擎MinSmarty.class.php文件及用法

    本文实例讲述了自定义的min版smarty模板引擎MinSmarty.class.php文件.分享给大家供大家参考,具体如下: 一.smarty的优点 smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一.它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离.简单的讲,目的就是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻

  • 为Python的Tornado框架配置使用Jinja2模板引擎的方法

    tornado 默认有一个模板引擎但是功能简单(其实我能用到的都差不多)使用起来颇为麻烦, 而jinja2语法与django模板相似所以决定使用他. 下载jinja2 还是用pip 下载(用的真是爽) pip install jinja2 这样就可以使用了. tornado与jinja2 整合 tornado和jinja2整合起来很简单(其实是网上找的比较简单), 不知道从那里找到的反正找到了,不说了直接上代码 #coding:utf-8 import tornado.web from jinj

  • 详解Node.js模板引擎Jade入门

    Jade是Node.js的一个模板引擎,它借鉴了Haml的很多地方,所以语法上和Haml比较相近.并且,Jade也支持空格. 1.标签 在Jade里,一行开头的任何文本都被默认解释成HTML标签.并且你只需要你写开始标签--注意:不需要加"<>".因为Jade会帮我们渲染闭合和开始标签.例如: body div h1 Jade是Node.js的一个模板引擎 p 它借鉴了Haml的很多地方,所以语法上和Haml比较相近. div footer © Pandora 上面的Jad

  • nodejs前端模板引擎swig入门详解

    相对于jade,我还是更喜欢swig前端模板引擎,jade虽然语法简练高效了不少,但是在我这最大的问题是 他没有一个html该有的样子... 所以我还是决定使用swig,页面结构,样子都是熟悉的样子,使用起来顺手了许多. 很多朋友也在纠结二者的优缺点,这个根据需求因人而异吧 这是两者的比较 http://vschart.com/compare/swig-template-engine/vs/jade-template-engin 下面我们一起学习下swig这个前端模板引擎 swig的简单介绍 s

  • 只有 20 行的 JavaScript 模板引擎实例详解

    本文实例讲述了 JavaScript 模板引擎.分享给大家供大家参考,具体如下: 原文链接:JavaScript template engine in just 20 lines (译者吐槽:只收藏不点赞都是耍流氓) 前言 我仍旧在为我的JS预处理器AbsurdJS进行开发工作.它原本是一个CSS预处理器,但之后它扩展成为了CSS/HTML预处理器,很快它将支持JS到CSS/HTML的转换.它就像一个模板引擎一样能够生成HTML代码,也就是说它能够用数据填充模板当中的标识片段. 因此,我希望去写

  • Java SpringBoot模板引擎之 Thymeleaf入门详解

    目录 模板引擎简介 引入Thymeleaf模板引擎 分析Thymeleaf模板引擎 测试Thymeleaf模板引擎 1.编写一个TestController 2.编写一个测试页面 test.html 放在 templates 目录下 3.启动项目请求测试 4.结论 Thymeleaf入门: 1.修改测试请求,增加数据传输 2.使用thymeleaf 3.我们去编写下前端页面 4.启动测试! thymeleaf语法学习 1.使用任意的 th:attr 来替换Html中原生属性的值! 2.表达式语法

  • 教你使用javascript简单写一个页面模板引擎

    于是我又想着能不能写一些简单的代码来完善这个模板引擎,又能与其它现有的逻辑协同工作.AbsurdJS本身主要是以NodeJS的模块的形式发布的,不过它也会发布客户端版本.考虑到这些,我就不能直接使用现有的引擎了,因为它们大部分都是在NodeJS上运行的,而不能跑在浏览器上.我需要的是一个小巧的,纯粹以Javascript编写的东西,能够直接运行在浏览器上.当我某天偶然发现John Resig的这篇博客,我惊喜地发现,这不正是我苦苦寻找的东西嘛!我稍稍做了一些修改,代码行数差不多20行左右.其中的

  • 简单的自定义php模板引擎

    模板引擎的思想是来源于MVC(Model View Controller)模型,即模型层.视图层.控制器层. 在Web端,模型层为数据库的操作:视图层就是模板,也就是Web前端:Controller就是PHP对数据和请求的各种操作.模板引擎就是为了将视图层和其他层分离开来,使php代码和html代码不会混杂在一起.因为当php代码和html代码混杂在一起时,将使代码的可读性变差,并且代码后期的维护会变得很困难. 大部分的模板引擎原理都差不多,核心就是利用正则表达式解析模板,将约定好的特定的标识语

  • PHP实现简单的模板引擎功能示例

    本文实例讲述了PHP实现简单的模板引擎功能.分享给大家供大家参考,具体如下: php web开发中广泛采取mvc的设计模式,controller传递给view层的数据,必须通过模板引擎才能解析出来.实现一个简单的仅仅包含if,foreach标签,解析$foo变量的模板引擎. 编写template模板类和compiler编译类.代码如下: <?php namespace foo\base; use foo\base\Object; use foo\base\Compiler; /** * */ c

随机推荐