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.     当浏览器再次调用显示方法时,首先根据各文件的最后修改时间,判断是否重新生成缓存文件或直接调用已存在的缓存文件

重点

通过正则表达式进行字符串的替换

本文参考:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨越行业绊脚石,阿里云函数计算发布 7 大技术突破

简介&#xff1a; 2021 云栖大会现场&#xff0c;阿里巴巴研究员、阿里云智能云原生应用平台总经理 丁宇&#xff08;叔同&#xff09;重磅发布了函数计算的 7 大技术创新和突破&#xff0c;加速现代应用架构的革新。 Serverless 的本质是通过屏蔽底层的计算资源&#xff0c;来…

业内首款云原生技术中台产品云原生 Stack 来了

简介&#xff1a; 云原生 Stack 满足了各种典型场景下客户对于线下高集成平台的诉求&#xff0c;让企业数字话转型不受技术约束&#xff0c;专注业务本身&#xff0c;加速企业数字化迭代。 今天&#xff0c;企业数字化转型依然面临很大的挑战&#xff0c;虽然有很多新技术不断…

从质疑到成为必选项,低代码技术发展及 2022 展望

2022年&#xff0c;CSDN 「低代码产品开发者使用与体验」线上调研&#xff0c;正式开启&#xff01;现在完成调研&#xff0c;就可参与抽奖活动&#xff0c;还有机会获得线下活动门票一张&#xff0c;和更多行业人士一起交流的机会。 前言 2022年低代码已经不是一个新鲜概念&am…

php魔术方法 效率,PHP常用魔术方法的性能探究

性能往往是衡量代码很重要的一个标准。我们日常编码中经常会用到一些魔术方法&#xff0c;这些PHP提供的魔术方法是否会影响我们程序的性能呢&#xff1f;是否需要减少魔术方法 的使用呢&#xff1f;本文将通过测试对比来了解魔术方法对性能的影响。疑惑魔术方法真的性能比较差…

一图速览 | DTCC 2021大会,阿里云数据库技术大咖都聊了些什么?

简介&#xff1a; 3天9场干货分享&#xff0c;快来收藏吧&#xff01; 10月18日~10月20日&#xff0c; 由国内知名IT技术社区主办的数据库技术交流盛会——DTCC 2021 (第十一届中国数据库技术大会)在京圆满落幕。大会以“数造未来”为主题&#xff0c;重点围绕数据架构、人工智…

AI深入应用,生态越加开放,开发者的机会在哪里?

作者 | 宋慧 出品 | CSDN云计算 IT 在吞噬一切&#xff0c;也在吞噬地球的能源消耗。 现在&#xff0c;全球的数据中心耗去了全球用电的 2%&#xff0c;到 2030 年时这个数字很有可能上升到 8%。风电&#xff0c;是地球上仅次于火电、水电的第三大电力来源&#xff0c;风电、光…

Serverless 工程实践 | 自建 Apache OpenWhisk 平台

简介&#xff1a; OpenWhisk 是一个开源、无服务器的云平台&#xff0c;可以在运行时容器中通过执行扩展的代码响应各种事件&#xff0c;而无须用户关心相关的基础设施架构。 OpenWhisk 简介 OpenWhisk 是基于云的分布式事件驱动的编程服务。OpenWhisk 提供一种编程模型&…

php弹幕技术轮询,PHP实现长轮询消息实时推送功能代码

入口文件index.html反ajax推送.send{color:#555;text-align: left;}.require{color:blue;text-align: right;}.content_box{text-align: center;margin: 20px;border: 1px solid #ddd;padding: 20px;}消息框12发送连接$(function(){//发送消息$(#btn_send).click(function(){va…

阿里云消息队列 RocketMQ 5.0 全新升级:消息、事件、流融合处理平台

简介&#xff1a; RocketMQ5.0 的发布标志着阿里云消息从消息领域正式迈向了“消息、事件、流”场景大融合的新局面。未来阿里云消息产品的演进也将继续围绕消息、事件、流核心场景而开展。 从“消息”到“消息、事件、流”的大融合 消息队列作为当代应用的通信基础设施&…

Gartner发布2022年政府行业重要业务趋势:数字化与创新、基础设施等

供稿 | Gartner 出品 | CSDN 云计算 时至2022年&#xff0c;政府领导人继续面临疫情带来不断变化的挑战&#xff0c;包括社会和经济领域的不确定因素。在2020年至2021年这段刚开始应对疫情的时期&#xff0c;为了满足公民服务和远程办公的需求&#xff0c;全球数字化程度呈指数…

随机段子api php,给博客添加一个名言段子语句随机播放的功能(集成Hitokoto)

之前浏览张戈的博客&#xff0c;发现他的文章页点赞下方有个很有意思的东西&#xff0c;一列显示一段句子&#xff0c;刷新一下会重新生成另外一个&#xff0c;主要包含段子、台词等有意思的话。余斗的博客不少内容都是参考张戈博客&#xff0c;虽然发现这个有趣的玩意很久了&a…

实践分享丨构建云上私有池(虚拟IDC)的5种方案详解

简介&#xff1a; 云上私有池系列终篇终于来了&#xff0c;本文将重点介绍构建云上的私有池&#xff08;虚拟IDC&#xff09;的多种方案和各自的优缺点&#xff0c;并给出相关的性价比优化建议。 本文作者&#xff1a;阿里云技术专家李雨前 摘要 围绕私有池&#xff08;虚拟…

2021云栖大会开源引力峰会发布的战略合作,Grafana服务到底是什么?

简介&#xff1a; 这几天关注云栖大会的小伙伴一定会发现阿里巴巴合伙人、阿里云高级研究员蒋江伟&#xff08;小邪&#xff09;在云栖大会开源引力峰会的演讲中&#xff0c;特别提到了一个叫 Grafana 服务的产品&#xff0c;并特意花费一页 PPT 介绍了这一次合作。到底是一个什…

因为一个循环,CPU搞了个新技术

作者 | 轩辕之风O 来源 | 编程技术宇宙 好久不见&#xff0c;我叫阿Q&#xff0c;是CPU一号车间的员工。我所在的CPU有8个车间&#xff0c;也就是8个核心&#xff0c;咱们每个核心都可以同时执行两个线程&#xff0c;就是8核16线程&#xff0c;那速度杠杠滴。 我所在的一号车间…

php关键字高亮,php站内搜索并高亮显示关键字的实现代码

代码如下:require_once sqlTools.class.php;//封装类&#xff0c;可执行dql、dml语句$info$_POST[info];$sql"select name,password,email from user_500 where name like %$info% or password like %$info% or email like %$info%";$sqlToolsnew SqlTools();$res$sq…

AI圈内卷?天池团聚请来专家集体“问诊”

简介&#xff1a; 近期杭州云栖大会上出现了一个“数据博物馆”&#xff0c;最吸引眼球的“展品”&#xff0c;竟是行业大规模开源数据集。不仅数量多达上百个&#xff0c;还覆盖零售、文娱、工业、医疗、自然科学等数十个行业。既有来自真实业务场景的商品数据&#xff0c;也不…

2021双11上云狂欢节 | 爆款产品底价全面开售

一年一度的双11狂欢节终于来啦&#xff01;怎样用最少的钱获得最多的福利&#xff1f;下面这份攻略收藏好&#xff0c;这波活动快冲&#xff01; 双11主会场&#xff1a;http://click.aliyun.com/m/1000304310/ 01 领取双11上云加油包 阿里云官网已实名认证的注册会员用户皆可…

针对场景化痛点,锐捷网络推出极简光 2.X,以太全光网再下一城

极简光 2.X 方案&#xff0c;旨在针对各行业的需求和痛点找到更合适的解法&#xff0c;为各行业的客户呈现更为适配的新产品。 出品 | CSDN云计算 光进铜退趋势之下&#xff0c;全光网在快速发展。 不过&#xff0c;更进一步在各个行业技术实施中&#xff0c;用户的痛点则多种多…

轻博客框架 php,DouPHP轻博客 v1.6 Release 20200925

DouPHP轻博客系统&#xff0c;基于PHPMYSQL架构的&#xff0c;可以使用它快速搭建一个博客系统。DouPHP轻博客系统功能特点操作简单后台简约明了&#xff0c;从使用者而不是开发者的角度出发设计后台功能布局&#xff0c;完全不需要使用手册就可以轻松进行日常内容编辑工作。功…

阿里云GanosBase升级,发布首个云孪生时空数据库

简介&#xff1a; GanosBase是李飞飞带领的达摩院数据库与存储实验室联合阿里云共同研发的新一代位置智能引擎&#xff1b;本次重磅升级为V4.0版本&#xff0c;推出首个云孪生时空数据库。 作者 | 谢炯 来源 | 阿里技术公众号 导读&#xff1a; GanosBase是李飞飞带领的达摩院…