php 模板解析,关于模板的原理和解析
PHP – 关于模板的原理和解析
将PHP代码和静态HTML代码进行分离,使代码的可读性和维护性得到显著提高。
使用模板引擎:
我们所说的模板是web模板,是主要由HTML标记组成的语言来编写的语言,但也有如何表示包含动态生成内容的方式(解析标签)。模板引擎是一种软件库,允许我们从模板生成HTML代码,并制定要包含的动态内容。
模板引擎的特点:
1、 鼓励分离:让各个系统的可读性和维护性得到提高。
2、 促进分工:使得程序员和美工去专心处理自己的设计
3、 比PHP更容易解析:编译文件和缓存文件加载更快,占资源更少。
4、 增加安全性:可限制模板设计师进行不安全的操作,避免误删误访问等。
解析类:
//模板解析类
class Parser{
//创建一个字段保存模板文件里的内容
private $_tpl;
//构造方法,用于接收模板文件
public function __construct($_tplFile){
if (!$this->_tpl = file_get_contents($_tplFile)){
exit('模板文件读取错误!');
}
}
//解析普通变量
private function parVar(){
// preg_match() 执行一个正则表达式匹配 如果第二个参数中包含第一个参数,则返回值为1
// preg_replace() 执行一个正则表达式的搜索和替换 参数1:要被替换的内容 参数2:被替换成的内容 参数3:包含替换内容的变量
// 正则表达式:'/\{\$([\w]+)\}/' 表示匹配{$ } $符后可以为 0-9 ,a-z ,A-Z 的任何值。 即等价为定义的变量
$_patten = '/\{\$([\w]+)\}/';
if (preg_match($_patten,$this->_tpl)){
$this->_tpl = preg_replace($_patten,"<?php echo \$this->_vars['$1'];?>",$this->_tpl);
}
}
//解析if语句
private function parIf(){
//正则表达式 \s :匹配一个或多个空白 \w :匹配a-z,0-9,A-Z和下划线的字符串
$_pattenIf = '/\{if\s+\$([\w]+)\}/';
$_pattenEndIf = '/\{\/if\}/';
$_pattenElse = '/\{else\}/';
if (preg_match($_pattenIf,$this->_tpl)){
if (preg_match($_pattenEndIf,$this->_tpl)){
$this->_tpl = preg_replace($_pattenIf,"<?php if (\$this->_vars['$1']){ ?>",$this->_tpl);
$this->_tpl = preg_replace($_pattenEndIf,"<?php } ?>",$this->_tpl);
if (preg_match($_pattenElse,$this->_tpl)){
$this->_tpl = preg_replace($_pattenElse,"<?php }else{ ?>",$this->_tpl);
}
}else{
exit('if语句没有关闭!');
}
}
}
//解析include语句
private function parInclude(){
$_patten = '/\{include\s+file=\"([\w\.\-]+)\"\}/';
// preg_match()的第三个参数 将第一个参数和其分组文件以数组的形式表达 [0]=>{include file="test.php"} [1]=>test.php
if (preg_match($_patten,$this->_tpl,$_file)){
if (!file_exists($_file[1]) || empty($_file)){
exit('包含文件出错!');
}
$this->_tpl = preg_replace($_patten,"<?php include '$1'; ?>",$this->_tpl);
}
}
//解析PHP代码注释
private function parCommon(){
$_patten = '/\{#\}(.*)\{#\}/';
// 正则表达式 (.* )表示任何内容
if (preg_match($_patten,$this->_tpl)){
$this->_tpl = preg_replace($_patten,"<?php /* $1 */ ?>",$this->_tpl);
}
}
//对外共方法
public function compile($_parFile){
//解析模板内容
$this->parVar();
$this->parIf();
$this->parCommon();
$this->parInclude();
//生成编译文件
// file_put_contents() 将一个字符串写入文件
// file_get_contents() 将整个文件读入一个字符串
if (!file_put_contents($_parFile,$this->_tpl)){
exit('编译文件生成出错!');
}
}
}
模板引擎的整个过程:
1. 当浏览器请求index.php文件时,实例化模板类对象$_tpl = new Templates();
2. 当template实例化的时候,生成两个数组,一个用来存放模板变量,另一个存放系统变量,通过构造方法,判断文件夹是否存在,同时通过XML文件将系统变量数组初始化
3. 通过模板类template的注入方法,assign(),将对应模板index.tpl中变量的index.php内容注入到模板类的私有变量,完成初始化
4. 模板类template类显示方法display()通过实例化解析parser,将取到的注入变量通过解析类进行解析(即替换)
5. 解析(替换)后,将文件写入PHP、HTML混全文件
6. 通过template类的显示方法将文件输出
缓存
1. 第一次执行显示方法时,将会把PHP、HTML混合文件,生成纯静态的缓存文件
2. 调用缓存文件,显示页面
3. 当浏览器再次调用显示方法时,首先根据各文件的最后修改时间,判断是否重新生成缓存文件或直接调用已存在的缓存文件
重点
通过正则表达式进行字符串的替换
本文参考:
php 模板解析,关于模板的原理和解析相关推荐
- Android-skin-support 换肤原理全面解析 1
文章目录 一.背景 二.demo 三.AppCompatActivity实现 四.Android创建View全过程解析 五.换肤原理详细解析 1.上文预备知识与换肤的关系 2.源码一,创建控件全过程 ...
- java调用js模板引擎_JavaScript模板引擎应用场景及实现原理详解
本文实例讲述了JavaScript模板引擎应用场景及实现原理.分享给大家供大家参考,具体如下: 一.应用场景 以下应用场景可以使用模板引擎: 1.如果你有动态ajax请求数据并需要封装成视图展现给用户 ...
- 【Vue源码】mustache模板引擎 - 基本使用 - 底层原理 - 手写实现
文章目录 1. 模板引擎的介绍 1.1 模板引擎是什么? 1.2 模板引擎是怎么来的?(发展历史) 1. 使用原生的DOM操作 2. 使用数组中的join方法 3. 使用ES6反引号的方法 2. mu ...
- Vue里标签嵌套限制问题解决------解析DOM模板时注意事项:
Vue里标签嵌套限制问题解决------解析DOM模板时注意事项: 参考文章: (1)Vue里标签嵌套限制问题解决------解析DOM模板时注意事项: (2)https://www.cnblogs. ...
- Struts2解析FreeMarker模板中变量的顺序
http://zhxing.iteye.com/blog/391560 关于FreeMarker 的基础学习请参考文档..这里主要记录 FreeMarker 的一些问题.. 1.FreeMarker ...
- C++ 泛型编程(一):模板基础:函数模板,类模板,模板原理,模板匹配规则
类模板 函数模板 泛型编程 泛型编程,泛型即是指具有在多种数据类型上皆可操作的含义,其实就是能够帮助开发者编写完全一般化并可重复使用的算法,同样的工作不需要做多次,同样的算法针对不同的类型也不应该写多 ...
- json解析适配模板_认识适配器:JSON绑定概述系列
json解析适配模板 适配器通过实现JsonbAdapter接口来配置自定义对象的创建和序列化. 方法AdaptToJson()和AdaptFromJson()被执行序列化和反序列化操作的逻辑覆盖. ...
- java 解析word模板为xml, 动态填充数据到xml,最后输出word文档
java 解析word模板为xml, 动态填充数据到xml,最后输出word文档 在项目中, 一开始是使用java Apache poi 根据word模板生成word报表, 后面发现框架有个低版本的p ...
- JAVA实现模板word文档导入,Java依据word模板生成word文档之后台解析和实现及部分代码(一)...
Java根据word模板生成word文档之后台解析和实现及部分代码(一) 后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换. ...
最新文章
- linux运行dock打包的镜像,Linux部署之Docker方式部署项目
- 【深度学习入门到精通系列】医学图像预处理—伽马变化代码
- 吴麒pdf 自动控制原理下_自动控制原理 第五讲 频域分析(下)
- Pandas进阶大神!从0到100你只差这篇文章!
- 2015.7.17( NOI2015 day1 )
- 牛客题霸 [数组中未出现的最小正整数] C++题解/答案
- 21复变函数的积分(七)
- thinkphp v5.0.11漏洞_ThinkPHP 5.0.x-5.0.23、5.1.x、5.2.x 全版本远程代码执行漏洞分析
- 学习强国中车万翔老师回文数代码在python3.7中输出inf问题
- “杀京东”京东价格监控软件项目开发日志一
- 读书感受 之 《好好说话2》
- Apache Doris在京东广告的应用
- 最新雷速问卷调查系统V7.15+ASP内核开发
- Win10文件夹莫名其妙闪退
- arch模型 matlab,ARCH模型(arch模型干嘛的)
- 网信办督促平台整改算法歧视、大数据杀熟:必须保护用户合法权益
- 关于simplis仿真和驱动方法
- 智能骨科图像方向,按照期刊进行的文献整理
- 怎样才能实现表格背景图片拉伸
- 【模型评价指标】分析模型评价常用指标
热门文章
- mysql索引过多为什么会慢_mysql – 为什么索引使这个查询更慢?
- 袁亚湘院士谈如何做好研究生:要逼着自己去想问题,最大的浪费是聪明人不思考...
- 1/4美国理工博士生中途离学 | Science:原因何在?
- 史无前例! 中国学者一天发6篇Nature,在多领域取得重大进展
- 两大数学家是如何撕破脸的|数学界的主义的之争
- 爱因斯坦:量子物理与抽象数学(广义)
- java实现考勤机信息同步
- 【转载保存】B+树索引原理以及应用案例
- java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决
- 当爬虫遇到需要动态ip才能获取资源的时候如何解决?