【smarty项目源码】模拟smarty模版文件的解析过程
- <?php
- class MyMiniSmarty{
- //模版文件的存放路径
- var $template_dir="./templates/";
- //编译文件的存放路径 ,编译文件的名称格式暂定为:com_对应的tpl.php
- var $complie_dir="./templates_c";
- //模版变量数组:存放所有模版变量的值
- var $tpl_vars=array();
- //这里我们主要模拟两个方法
- //参数1-模版变量 参数2:模版变量的值
- function assign($tpl_var,$val=null){
- if($tpl_var!=''){
- $this->tpl_vars[$tpl_var]=$var;
- }
- }
- //这里编写display
- //参数1-要显示的模版文件名
- function display($tpl_file){
- //模版文件的路径
- $tpl_file_path=$this->template_dir.$tpl_file;
- //编译文件的命名及路径
- $complie_file_path=$this->complie_dir."com_".$tpl_file.".php";
- //判断当前模版文件是否存在
- if(!file_exists($tpl_file_path)){
- //如果当前模版文件不存在,则返回false
- return false;
- }
- //查看是否有编译文件,如果没有编译文件,或者说模版文件的修改时间大于编译文件的生成时间,则需要重新编译
- if(!file_exists($comlie_file_path) ||filemtime($tpl_file_path)>filemtime($complie_file_path)){
- //获取模版文件的内容
- $tpl_file_content=file_get_contents($tpl_file_path);
- //这里我们的核心是怎样把tpl转化为php文件
- $pattern=array(
- //1.\{ - 转义{ 左括号 2.\s* - 代表一个或多个空格 3.\$ - 转义$符号 4.\} - 转义 } 右括号
- '/\{\s*\$([a-zA-Z][a-zA-Z0-9]*)\s*\}/i'
- );
- $replace=array(
- '<?php echo $this->tpl_vars["${1}"] ?>'
- );
- //将类似 {$title}替换为<?php echo $this->tpl_vars["title"] ? >,返回替换后的字符串
- $new_str=preg_replace($pattern,$replace,$tpl_file_content);
- //编译文件的生成:将正则替换后的模版文件中的内容写入到编译文件
- file_put_contents($complie_file_path,$new_str);
- }
- //如果存在编译文件并且模版文件没有改动,则直接引入编译文件
- include $complie_file_path;
- }
- }
- ?>
注意:对象也可以作为模版变量
案例:
php文件:
$smarty=new Smarty();
$var1=“简单字符串”;
$var2=new 对象名();
$var3=array(内容列表..);
$smarty->assign(“var1”,$var1);
$smarty->assign(“var2”,$var2);
$smarty->assign(“var3”,$var3);
模版文件:
取出 var1 对应的值: {$var1}<br/>
取出 var2 对应的值: {$var2->属性或者方法}
取出 var3 对应的值: {$var3[下标]}
【smarty项目源码】模拟smarty模版文件的解析过程的更多相关文章
- Spring源码情操陶冶-ComponentScanBeanDefinitionParser文件扫描解析器
承接前文Spring源码情操陶冶-自定义节点的解析,本文讲述spring通过context:component-scan节点干了什么事 ComponentScanBeanDefinitionParse ...
- Spring源码情操陶冶-自定义节点的解析
本文承接前文Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions,特开辟出一块新地来啃啃这块有意思的骨头 自定义节 ...
- Spring源码情操陶冶-AnnotationConfigBeanDefinitionParser注解配置解析器
本文承接前文Spring源码情操陶冶-自定义节点的解析,分析spring中的context:annotation-config节点如何被解析 源码概览 对BeanDefinitionParser接口的 ...
- Android 开源项目源码解析(第二期)
Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...
- EDKII Build Process:EDKII项目源码的配置、编译流程[三]
<EDKII Build Process:EDKII项目源码的配置.编译流程[3]>博文目录: 3. EDKII Build Process(EDKII项目源码的配置.编译流程) -> ...
- Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览
关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...
- C#项目 学生选课系统 C#窗口 Winform项目 项目源码及使用说明
这是一个学生选课信息管理系统,使用VS2010+SQL2008编写,VS2017正常使用. 项目源码下载地址 https://gitee.com/whuanle/xkgl 笔者录了两个视频,打开项目源 ...
- java crm 进销存 springmvc SSM 项目 源码 系统
系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM ...
- Java SSM 客户管理 商户 管理系统 库存管理 销售报表 项目源码
系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM ...
随机推荐
- WebApp基础01-设置读取assets目录下文件
要读取assets下的目录,只需要修改三个地方即可 1.res/layout/activity_main.xml 2.AndroidManifest.xml 3.src\com\example\lcy ...
- Yii URL
参考文章: http://blog.csdn.net/iefreer/article/details/21325371 以http://localhost/basic/web/index.php?r= ...
- 将excel文件中的数据导入到mysql
·在你的表格中增加一列,利用excel的公式自动生成sql语句,具体方法如下: 1)增加一列(假设是D列) 2)在第一行的D列,就是D1中输入公式:=CONCATE ...
- ng-repeat指令使用详解
ng-repeat指令使用详解 link: function(scope,element,attr) scope.$index: if(scope.$last == true){} attr['mng ...
- linux下如何使用sftp命令【转】
linux下如何使用sftp命令 from: http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888391.html sftp 是一个 ...
- 我也来写:数据库访问类DBHelper(转)
一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...
- sql server cpu占用过高优化
SQLSERVER排查CPU占用高的情况 今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高 ...
- 调用WebService 实现在线双向翻译
>先了解一下Web Service的基本概念: Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传 ...
- 【C语言入门教程】2.8 C 语言的预处理命令
预处理命令是在程序编译阶段进行执行的命令,用于编译与特定环境相关的可执行文件.预处理命令扩展了 C 语言,本节将选择其中一些常用的预处理命令进行讲解. 2.8.1 宏替换命令 宏替换命令的作用类似于对 ...
- Asp.net 网站防攻击安全设置
针对已解密的_ViewStat参数漏洞整改建议:在<system.web>下添加 <machineKey validation="3DES"/> 禁用脚本调 ...