博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自己写一个简单的模版引擎
阅读量:5991 次
发布时间:2019-06-20

本文共 3804 字,大约阅读时间需要 12 分钟。

   现在离职在家,突然发现没什么事儿做了,就研究研究了smarty,写了一个简单的搜索引擎。包含

assign赋值,display模版解析的方法,

新建一个MyTpl.class.php(其他名称也可以)

   代码如下:

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)
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(                '
tpl_vars["${1}"]?>',                //变量替换                '$this->stripvtags(\'
\',\'${2}
\')',                '$this->stripvtags(\'
\',"")',                '
',                '
tpl_vars["${1}"] as $this->tpl_vars["${2}"]) { ?>${3}
',                '
tpl_vars["${1}"] as $this->tpl_vars["${2}"]=>$this->tpl_vars["${3}"]){?>$(4)
',                '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,写上相应的代码,我只是做一个简单的测试,

    <{$title}>        <{$title}>    

然后在浏览器中预览,就可以实现,我写的正则替换里,也包括一个loop的foreach替换标签。大家可以继续扩展完善,我也会继续完善一套自己的模版引擎。


footer.jpg

转载地址:http://fevlx.baihongyu.com/

你可能感兴趣的文章
跟小静读CLR via C#(09)-扩展方法
查看>>
Flex的UI组件Tile
查看>>
Java中对象的等价性比较
查看>>
SQL datediff 计算时间差
查看>>
网易有道面经(2013校园招聘杭州站)zz
查看>>
项目团队建设
查看>>
IOS中block和代理
查看>>
Codeforces Round #196 (Div. 2) A. Puzzles 水题
查看>>
Can only modify an image if it contains a bitmap
查看>>
[.net 面向对象程序设计进阶] (1) 开篇
查看>>
JavaScript权威设计--JavaScript类型,值,变量(简要学习笔记三)
查看>>
Oracle一个中文汉字占用几个字节
查看>>
汇编开发环境
查看>>
git reset --hard 回滚以后 以后怎么再回去?
查看>>
【转】测试趋势之我的观点
查看>>
静态和动态链接
查看>>
500 OOPS: vsftpd: cannot locate user specified in 'chown_username':whoever
查看>>
解锁redis锁的正确姿势
查看>>
Kylin如何进行JDBC方式访问或者调用
查看>>
学习jQuery
查看>>