资讯专栏INFORMATION COLUMN

代码解释类似smart模版引擎原理

forrest23 / 2652人阅读

摘要:先贴下目录结构模版编译后的目录模版源文件夹山寨类文件源文件文件夹编译之后文件夹需要替换的左边标记需要替换的左边标记当前正在编译的模版文件名正在读取的模版文件模版变量池把用到的变量放入到变量池子中取出一条变量,用于下面的正则替换

先贴下目录结构:

 ls
compiled/  index.php  source/  ss.class.PHP

compiled 模版编译后的目录
index.php
source 模版源文件夹
ss.clsss.php 山寨类smarty文件
ss.clsss.php
templateDir=$templateDir;
            $this->compileDir=$compileDir;

            if(!empty($leftTag))$this->leftTag=$leftTag;
            if(!empty($rightTag))$this->rightTag=$rightTag;
            if(!empty($templateExtName))$this->templateExtName=$templateExtName;
        }

        // 把用到的变量放入到变量池子中
        public function assign($tag,$var){
            $this->varPool[$tag]=$var;
        }

        // 取出一条变量,用于下面的str_replace正则替换
        public function getVar($tag){
            return $this->varPool[$tag];
        }

        //获取模版源文件
        public function getSourceTemplate($templateName){

            $this->currentTemp=$templateName;

            // 拼接完整文件名
            $sourceFileName=$this->templateDir.$this->currentTemp.$this->templateExtName;
            $this->outputHtml=file_get_contents($sourceFileName);
        }

        // 编译
        public function compileTemplate($templateName=null){

            // 获取当前需要编译的模版
            $templateName=empty($templateName)?$this->currentTemp:$templateName;

            // $pattern="/{#($[a-zA-Z_]w+)#}/";// 符合php变量命名

            //preg_quote 可对用户界定的左右定界符中出现.  + * ? [ ^ ] $ ( ) { } = ! < > | : -进行转义
            $pattern="/".preg_quote($this->leftTag);

            //前后加上空格匹配任意次匹配类似

{# $name #}

$pattern.=" *$([a-zA-Z_]w*) *"; $pattern.=preg_quote($this->rightTag)."/"; // $1写成1也可以 ,$1为正则的匹配单元,或者可以说是总(子)模式 $this->outputHtml=preg_replace($pattern, "getVar("$1");?>", $this->outputHtml); // 注意不要用双引号,会解析getvar Template::$getVar报notice错误 $this->outputHtml=preg_replace($pattern, "getVar(1);?>", $this->outputHtml); $compileFileName=$this->compileDir.md5($templateName).$this->templateExtName; file_put_contents($compileFileName, $this->outputHtml); } // 输出 public function display($templateName=null){ $templateName=empty($templateName)?$this->currentTemp:$templateName; include($this->compileDir.md5($templateName).$this->templateExtName); } }

简单调用如下:(index.php中内容)

assign("name","iamtb");

    $test->assign("pageTitle","tbtbt");

    $test->getSourceTemplate("index");

    $test->compileTemplate("index");

    $test->display("index");

既然你看到这里,其实这篇文章写的更好

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21328.html

相关文章

  • 构建一个使用 Virtual-DOM 的前端模版引擎

    摘要:目录前言问题的提出模板引擎和结合的实现编译原理相关模版引擎的词法分析语法分析与抽象语法树代码生成完整的结语前言本文尝试构建一个前端模板引擎,并且把这个引擎和进行结合。于是就构思了一个方案,在前端模板引擎上做手脚。 作者:戴嘉华 转载请注明出处并保留原文链接( https://github.com/livoras/blog/issues/14 )和作者信息。 目录 前言 问题的提出...

    imccl 评论0 收藏0
  • 前端常用插件、工具类库汇总

    摘要:页面调试腾讯开发维护的代码调试发布,错误监控上报,用户问题定位。同样是由腾讯开发维护的代码调试工具,是针对移动端的调试工具。前端业务代码工具库。动画库动画库,也是目前通用的动画库。 本人微信公众号:前端修炼之路,欢迎关注 本篇文章整理自己使用过的和看到过的一些插件和工具,方便日后自己查找和使用。 另外,感谢白小明,文中很多的工具来源于此。 弹出框 layer:http://layer....

    GitCafe 评论0 收藏0
  • Express 实战(七):视图与模板:Pug 和 EJS

    摘要:而框架中最常用的两个视图引擎是和。实际上这些上下文对象就是会在视图中使用到的变量。其实视图缓存并不是缓存视图实际上它缓存的视图路径。根据默认视图引擎将缺少拓展名的视图文件补充完整。实际上存在由不同组织维护的两个不同版本的。 showImg(https://segmentfault.com/img/remote/1460000010821004);前面的内容大都是关于 Express 框...

    wmui 评论0 收藏0
  • velocity的基本使用 && 实例讲解

    摘要:的简介是一个基于的模板引擎。使用,也可以写成。所以,应该使用规范的格式书写现在知道变量是而不是。如当页面中包含,如果对象有值,将显示的值,如果不存在对象同,则在页面中将显示字符。 velocity的简介 Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象,...

    zhunjiee 评论0 收藏0
  • velocity的基本使用 && 实例讲解

    摘要:的简介是一个基于的模板引擎。使用,也可以写成。所以,应该使用规范的格式书写现在知道变量是而不是。如当页面中包含,如果对象有值,将显示的值,如果不存在对象同,则在页面中将显示字符。 velocity的简介 Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象,...

    scq000 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<