创建TPL自定义模板

article/2025/10/10 23:47:59

文件布局

 

 

<!--1d7c7a527b6335cc7a623305ca940e1findex.tpl.html--><!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><meta http-equiv="Content-Type" content="text/html";charset="utf-8"><title>小明在线</title>
</head>
<body>
小明你在干嘛?<!--我是静态页面-->
<hr/><div>我是二号页面</div>
<hr/>0...1<br/>1...2<br/>2...3<br/>3...4<br/>4...5<br/>5...6<br/>6...7<br/>分页数是10</body>
</html>
<!--系统变量文件 profile.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<root><taglib><name>webname</name><value>小明在线</value></taglib><taglib><name>pagesize</name><value>10</value></taglib>
</root>
<!--Parser.class.php解析类-->
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2015/8/28
 * Time: 10:27
 */
//模板解析类
class Parser {
    //字段保存模板类内容
    private $_tpl;    function __construct($_tplFile){
        if(!$this->_tpl=file_get_contents($_tplFile)){
            exit('ERROR:模板文件读取错误!');
        }
    }    //解析普通变量
    private function parVar(){
        $_pattern='/\{\$([\w]+)\}/';
        if(preg_match($_pattern,$this->_tpl)){
            $this->_tpl=preg_replace($_pattern,"<?php echo \$this->_vars['$1'];?>",$this->_tpl);
        }
    }    //解析if else语句
    private function parIf(){
        $_patternStartIf='/\{if\s+\$([\w]+)\}/';
        $_patternEndIf='/\{\/if\}/';
        $_patternStartElse='/\{else\}/';
        $_patternEndElse='/\{\/else\}/';
        if(preg_match($_patternStartIf,$this->_tpl)){
            $this->_tpl=preg_replace($_patternStartIf,"<?php if(\$this->_vars['$1']){?>",$this->_tpl);
            if(preg_match($_patternEndIf,$this->_tpl)){
                $this->_tpl=preg_replace($_patternEndIf,"<?php }?>",$this->_tpl);
                if(preg_match($_patternStartElse,$this->_tpl)){
                    $this->_tpl=preg_replace($_patternStartElse,"<?php }else{?>",$this->_tpl);
                }
            }else{
                exit('ERROR:if语句没有关闭!');
            }
        }
    }    //PHP注释解析
    private function parCommon(){
        $_patternCommon='/\{#(.*)#\}/';
        if(preg_match($_patternCommon,$this->_tpl)){
            $this->_tpl=preg_replace($_patternCommon,"<?php /* $1 */?>",$this->_tpl);
        }else{
            exit('ERROR:PHP注释解析错误!');
        }
    }    //foreach语句解析
    private function parForeach(){
        $_patternStartForeach='/\{foreach\s+\$([\w]+)\(([\w]+),([\w]+)\)\}/';
        $_patternEndForeach='/\{\/foreach\}/';
        $_patternKeyOrValue='/\{@([\w]+)\}/';
        if(preg_match($_patternStartForeach,$this->_tpl)){
            if(preg_match($_patternEndForeach,$this->_tpl)){
                $this->_tpl=preg_replace($_patternStartForeach,"<?php foreach(\$this->_vars['$1'] as \$$2=>\$$3){?>",$this->_tpl);
                $this->_tpl=preg_replace($_patternEndForeach,"<?php }?>",$this->_tpl);
                if(preg_match($_patternKeyOrValue,$this->_tpl)){
                    $this->_tpl=preg_replace($_patternKeyOrValue,"<?php echo \$$1;?>",$this->_tpl);
                }
            }else{
                exit('ERROR:foreach语句没有关闭!');
            }
        }
    }    //include语句解析
    private function parInclude(){
        $_patternInclude='/\{include\s+file=\"([\w\.\_]+)\"\}/';
        if(preg_match($_patternInclude,$this->_tpl,$_file)){
            if(!file_exists($_file[1])||empty($_file)){
                exit('ERROR:包含文件出错!');
            }
            $this->_tpl=preg_replace($_patternInclude,"<?php include ROOT_PATH.'/$1';?>",$this->_tpl);
        }
    }    //系统变量解析
    private function parConfig(){
        $_patternConfig='/<!--\{([\w]+)\}-->/';
        if(preg_match($_patternConfig,$this->_tpl)){
           $this->_tpl=preg_replace($_patternConfig,"<?php echo \$this->_config['$1'];?>",$this->_tpl);
        }
    }    //对外公共接口
    public function compile($_parFile){
        //解析模板内容
        $this->parVar();
        $this->parIf();
        $this->parCommon();
        $this->parForeach();
        $this->parInclude();
        $this->parConfig();
        //生成编译文件
        if(!file_put_contents($_parFile,$this->_tpl)){
            exit('ERROR:编译文件出错!');
        }
    }
}?> 
 
<!--Templates.class.php模板类-->
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2015/8/28
 * Time: 10:26
 */
//模板类
class Templates {
    //动态接收 变量
    private $_vars=array();
    //保存系统变量
    private $_config=array();    //创建一个构造方法判断各个目录是否存在
    public function __construct()
    {
        if(!is_dir(TPL_DIR)||!is_dir(TPL_C_DIR)||!is_dir(CACHE_DIR)){
            exit('ERROR:模板文件目录或编译文件目录或缓存文件目录不存在,请手动添加!');
        }
        $_sxe=simplexml_load_file('config/profile.xml');
        $_taglib=$_sxe->xpath('/root/taglib');
        foreach($_taglib as $_tag){
            $this->_config["$_tag->name"]=$_tag->value;
        }
    }    //assign()方法,用于注入变量
    public function assign($_var,$_value){
        //$_var用于同步模板里的变量,$_var相当于index.php里的name,那么在index.tpl中就是{$name}
        //$_value相当于index.php里的$_value,在index.php里就是$_name
        if(isset($_var)&&!empty($_var)){
            $this->_vars[$_var]=$_value;
        }else{
            exit('ERROR:请设置模板变量!');
        }
    }    //display方法
    public function display($_file){
        //设置模板路径
        $_tplFile=TPL_DIR.$_file;
        //判断模板文件是否存在
        if(!file_exists($_tplFile)){
            exit('ERROR:模板文件不存在!');
        }
        //编译文件
        $_parFile=TPL_C_DIR.md5($_file).$_file.'.php';
        //缓存文件
        $_cacheFile=CACHE_DIR.md5($_file).$_file.'.html';
        //如果第二次运行相同的文件,只需要载入缓存文件
        if(IS_CACHE){
            //编译文件和缓存文件必须同时存在
            if(file_exists($_parFile)&&file_exists($_cacheFile)){
                //编译文件和缓存文件没有修改过
                if(filemtime($_parFile)>=filemtime($_tplFile)&&filemtime($_cacheFile)>=filemtime($_parFile)){
                    //载入缓存文件
                    include $_cacheFile;
                    return;
                }
            }
        }
        if(!is_file($_parFile)||filemtime($_parFile)<filemtime($_tplFile)){
            //引入模板解析类
            require ROOT_PATH.'/includes/Parser.class.php';
            $_parser=new Parser($_tplFile);
            $_parser->compile($_parFile);
        }
        //载入编译文件
        include $_parFile;
        if(IS_CACHE) {
            //获取缓存区里的数据,并创建缓存文件
            file_put_contents($_cacheFile, ob_get_contents());
            //清除缓冲区里(编译文件加载的内容)
            ob_clean();
            //载入缓存文件
            include $_cacheFile;
        }
    }
}?> 
<!--index.tpl模板文件-->
<!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><meta http-equiv="Content-Type" content="text/html";charset="utf-8"><title><!--{webname}--></title>
</head>
<body>
{$name}{$content}
<!--我是静态页面-->
{#我是php中注释#}
<hr/>{if $a}
    <div>我是一号界面</div>
    {else}<div>我是二号页面</div>
{/if}
<hr/>{foreach $array(key,value)}
    {@key}...{@value}<br/>
{/foreach}分页数是<!--{pagesize}-->
</body>
</html>
<!--由模板生成的1d7c7a527b6335cc7a623305ca940e1findex.tpl.php解析文件-->
<!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><meta http-equiv="Content-Type" content="text/html";charset="utf-8"><title><?php echo $this->_config['webname'];?></title>
</head>
<body>
<?php echo $this->_vars['name'];?><?php echo $this->_vars['content'];?>
<!--我是静态页面-->
<?php /* 我是php中注释 */?>
<hr/><?php if($this->_vars['a']){?><div>我是一号界面</div><?php }else{?><div>我是二号页面</div>
<?php }?>
<hr/><?php foreach($this->_vars['array'] as $key=>$value){?><?php echo $key;?>...<?php echo $value;?><br/>
<?php }?>分页数是<?php echo $this->_config['pagesize'];?>
</body>
</html>
<!--主页面index.php-->
<?php
/*** Created by PhpStorm.* User: Administrator* Date: 2015/8/28* Time: 10:02*/
require dirname(__FILE__).'/template.inc.php';
//实例化模板类
$_tpl=new Templates();
//声明一个变量
$_name='小明';
$_content='你在干嘛?';
$_array=array(1,2,3,4,5,6,7);
//注入变量  name相当于index.tpl里的{$name}
$_tpl->assign('name',$_name);
$_tpl->assign('content',$_content);
$_tpl->assign('a',5<4);
$_tpl->assign('array',$_array);
//载入tpl文件
$_tpl->display('index.tpl');
?>
<!--template.inc.php辅助index.php的分担代码页面-->
<?php
/*** Created by PhpStorm.* User: Administrator* Date: 2015/8/29* Time: 20:05*/
//开启缓冲区
ob_start();
//设置utf-8编码
header('content-type:text/html;charset="utf-8"');
//网站根目录
define('ROOT_PATH',dirname(__FILE__));
//模板文件目录
define('TPL_DIR',ROOT_PATH.'/templates/');
//编译文件目录
define('TPL_C_DIR',ROOT_PATH.'/templates_c/');
//缓存文件目录
define('CACHE_DIR',ROOT_PATH.'/cache/');
//是否开启缓冲区
define('IS_CACHE',true);
//判断是否开启缓冲区
IS_CACHE?ob_start():null;
//引入模板类
require ROOT_PATH.'/includes/Templates.class.php';
?> 
 

http://chatgpt.dhexx.cn/article/ukAL7V4P.shtml

相关文章

php tpl模板文件,php自己创建TPL模板引擎之初学习

一&#xff0c;创建初始化模板所需的文件和文件夹。 1&#xff0c;index.php主文件&#xff0c;用于编写业务逻辑。 2&#xff0c;template.inc.php模板初始化文件&#xff0c;用于初始化模板信息。 3&#xff0c;templates目录存放所有的模板文件。 4&#xff0c;templates_c目…

观远数据苏春园:五年AI+BI路,数智化破局中的变与不变|数据猿采访

““2021年终大型金猿主题策划活动”已正式开启&#xff0c;欢迎报名参与&#xff1a;榜单奖项产业图谱行业报告线下论坛&#xff5c;或点击文末“阅读原文”链接后提交活动意向报名表&#xff0c;并进一步与数据猿工作人员沟通后&#xff0c;可获取相关申报资料与模板。 数据智…

大咖 | 王汉生:从数据到价值的转化,回归分析的“道”与“术”

摘自《数据思维》 作者&#xff1a;王汉生 学过统计学的同学们都知道一件事情&#xff0c;回归分析师数据分析的一个非常重要的模型方法。而且这些模型很可能是线性的、非线性的,也可能是参数的、非参数的,甚至是一元的、多元的,低维的、高维的,不尽相同。所以&#xff0c;把数…

李宏毅深度学习--《Backpropagation》

李宏毅深度学习 Gradient Descent of neural network&#xff1a; n e u r a l n e t w o r k neural\ \ network neural network的参数&#xff1a; θ { w 1 , w 2 , ⋯ , b 1 , b 2 , ⋯ } θ\{w_1,w_2,\cdots,b_1,b_2,\cdots \} θ{w1​,w2​,⋯,b1​,b2​,⋯}计算参数 θ…

郑宇:多源数据融合与时空数据挖掘(转载)

来自&#xff1a; https://mp.weixin.qq.com/s?__bizMzAwMTA3MzM4Nw&mid2649440531&idx1&snd9c92b1f157ee37c7c6e185919a3ffbb&chksm82c0a897b5b721810f4d795cc144d309086274a9071515e727f9f420d7ffb7f06c9b376557ee&scene21#wechat_redirect 和https:/…

近10年数据智能团队建设,联想总结了由内而外的发展经验 | 专访联想集团副总裁田日辉...

来源&#xff1a;大数据文摘 本文约3300字&#xff0c;建议阅读5分钟。 本文为清华大学大数据研究中心联合大数据文摘发起的年度白皮书《顶级数据团队建设全景报告》系列专访的第四篇内容。《报告》囊括专家访谈、问卷、网络数据分析&#xff0c;力求为行业内数据团队的组建和高…

谷俊丽:基于大数据的深度学习

嘉宾介绍&#xff1a;谷俊丽&#xff0c;博士学历&#xff0c;毕业于清华大学-美国University of Illinois Urbana-champaign大学&#xff0c;在清华期间作为核心人员研发过超长指令字数字信号处理器&#xff0c;在美期间曾参与UIUC超级计算机上的研究工作&#xff0c;并工作实…

MyBatis从入门到精通(1):MyBatis入门

作为一个自学Java的自动化专业211大学本科生&#xff0c;在学习和实践过程中”趟了不少雷“&#xff0c;所以有志于建立一个适合同样有热情学习Java技术的参考“排雷手册”。 最近在读刘增辉老师所著的《MyBatis从入门到精通》一书&#xff0c;很有收获&#xff0c;于是将自己学…

给力!低代码开发平台广州流辰信息科技助您增辉创价值!

低代码平台开发公司流辰信息深耕行业多年&#xff0c;一直以市场为导向&#xff0c;凭借敏锐的市场洞察力砥砺前行、拼搏进取&#xff0c;提升研发创新能力&#xff0c;广州流辰信息科技与各新老客户朋友风雨同舟&#xff0c;携手共创宏伟新蓝图&#xff01; 一、熔铸前沿科技 …

汇聚数据库创新力量,加速企业数字化转型

2022年12月29日&#xff0c;以“汇聚数据库创新力量&#xff0c;加速企业数字化转型”为主题的openGauss Summit 2022在线上举行。会上&#xff0c;openGauss社区理事会理事长江大勇对外公布了最近社区及生态进展&#xff0c;并宣布推出资源池化架构&#xff0c;实现软硬融合&a…

【金猿人物展】龙盈智达首席数据科学家王彦博:量子科技为AI大数据创新发展注入新动能...

‍ 王彦博 本文由龙盈智达首席数据科学家王彦博撰写并投递参与“数据猿年度金猿策划活动——2022大数据产业趋势人物榜单及奖项”评选。 ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 回顾2022年大数据行业发展&#xff0c;令人感触最深的是数字经济时代对“数据安全”和…

MyBatis从入门到精通(一):MyBatis入门

最近在读刘增辉老师所著的《MyBatis从入门到精通》一书&#xff0c;很有收获&#xff0c;于是将自己学习的过程以博客形式输出&#xff0c;如有错误&#xff0c;欢迎指正&#xff0c;如帮助到你&#xff0c;不胜荣幸&#xff01; 1. MyBatis简介 ​ 2001年&#xff0c;Clinton …

沈定刚,雷柏英,李超 | Cell Press Live:人工智能在医学影像中的应用

交叉学科 Interdisciplinary 医学影像是临床医疗诊断的重要依据之一。近些年来&#xff0c;随着信息技术的飞速发展&#xff0c;人工智能即AI也更加广泛地应用于医学影像的处理分析中&#xff0c;包括对图像的分割分类及预测等。AI提高了诊断的精准程度和效率&#xff0c;同时也…

汇纳科技张宏俊:加强布局AI大数据,为实体商业服务

数字经济是继农业经济、工业经济之后的主要经济形态,更是稳定经济,推动经济转型的最强劲动力之一。在今年两会政府工作报告中,数字经济的关注程度远比以往更高,首次以“单独成段”的方式进行表述,并重点明确了“深入实施创新驱动发展战略,巩固壮大实体经济根基”。 从中不…

【Java架构:基础技术】一篇文章搞掂:MyBatis

本文篇幅较长&#xff0c;建议合理利用右上角目录进行查看&#xff08;如果没有目录请刷新&#xff09;。 本文主要总结于刘增辉的《MyBatisc从入门到精通》一书&#xff0c;有兴趣的朋友可以自行研读 建议仔细研读官方文档&#xff1a; http://www.mybatis.org/mybatis-3/zh/ …

Oracle的minus使用

Oracle的minus使用 minus 连接两个结果集&#xff0c;最终生成一个结果集。 功能是&#xff1a;第二个结果集&#xff0c;不会出现在最终结果集中&#xff1b; 如果第一个结果集的内容&#xff0c;在第二个结果集之内有包含&#xff0c;则包含的部分在最终结果集被舍弃。 其实…

MySQL MINUS-差集 [猿教程]

https://yuanjiaoc.com/tutorial/article/10143 在本教程中&#xff0c;您将了解 SQL MINUS 运算符以及如何在 MySQL 中使用 join 模拟 MINUS。 请注意&#xff0c;MySQL 不支持 MINUS 运算符。本教程向您展示如何使用连接子句在 MySQL 中模拟 MINUS 运算符。 SQL MINUS 运算符…

oracle函数之 minus

“minus”直接翻译为中文是“减”的意思&#xff0c;在Oracle中也是用来做减法操作的 Oracle的minus是按列进行比较的&#xff0c;所以A能够minus B的前提条件是结果集A和结果集B需要有相同的列数&#xff0c;且相同列索引的列具有相同的数据类型。此外&#xff0c;Oracle会对m…

Sql server中intersect, minus的用法

Sql server中intersect, minus的用法 一&#xff0c;Intersect Intersect常用来选择两个表格中相关联的事物&#xff0c;它是对两个SQL语句所产生的结果作处理的.它的作用有点像and的用法&#xff0c;就是说所选择的这个值要存在于第一句和第二句才会被选择出&#xff0c;上面…

编译原理 C-Minus 语法分析(Flex / Bison)

C-Minus 源代码 语法分析 文章目录 C-Minus 源代码 语法分析一、实现目标二、实现过程1. 综述2. 实现功能介绍&#xff08;1&#xff09;检测词法错误&#xff08;2&#xff09;检测文法错误&#xff08;3&#xff09;生成语法分析树 3. 代码详解&#xff08;1&#xff09;synt…