php基本的模板引擎

1,配置文件:config.php

<?php

/**

*@yzt

*TPL_CACHE 用于指定生成.php 的路径(文件)

*TPL_PATH 用于指定生成 模板的文件路径

**/

define(‘TPL_CACHE‘,‘./cache/‘);
define(‘TPL_PATH‘,‘./views/‘);

2,测试 demo1.php

/**

*include 文件导入

*compact 数据数组化

***/

<?php
include ‘config.php‘;

include ‘tpl.func.php‘;

$title = ‘看到女神容易自悲‘;

$content = ‘要想办法拉平你们的关系,不然下手准失败‘;

$footercontent = ‘因为你会扭捏,不自然,女神就会跟你打低分‘;

$data = [
‘yzt‘ => ‘yzt‘,
‘xyy‘ => ‘xyy‘,
];

display(‘moban.html‘,compact(‘title‘,‘content‘,‘data‘,‘footercontent‘));

3,引擎(核心)tpl.func.php

<?php

//两个参数 1,html 模板; 2,需要修改的参数
function display($tplFile, $tplVars = null)
{
$tplFilePath = rtrim(TPL_PATH,‘/‘) . ‘/‘ . $tplFile;

if (!file_exists($tplFilePath)) {

exit(‘模版文件不存在‘);
}

$html = compile($tplFilePath);

$cacheFileName = parsePath($tplFile);

if (!check_cache_dir(TPL_CACHE)) {

exit(‘缓存目录不可写‘);
}

if (!file_put_contents($cacheFileName, $html)) {

exit(‘缓存文件写入失败‘);
}

if (is_array($tplVars)) {

extract($tplVars);

include $cacheFileName;

}

}

function check_cache_dir($path)
{
if(!file_exists($path) || !is_dir($path)) {

return mkdir($path,0755,true);
}
if(!is_writeable($path) || !is_readable($path)) {

return chmod($path,0755);
}
return true;
}

function parsePath($tplFile)
{
$path = rtrim(TPL_CACHE,‘/‘).‘/‘.str_replace(‘.‘,‘_‘,$tplFile).‘.php‘;
return $path;
}

function compile($path)
{
$keys = [

‘{if %%}‘              =>    ‘<?php if(\1): ?>‘,
‘{else}‘                  =>    ‘<?php else : ?>‘,
‘{else if %%}‘        =>    ‘<?php elseif(\1) : ?>‘,
‘{elseif %%}‘         =>    ‘<?php elseif(\1) : ?>‘,
‘{/if}‘                    =>    ‘<?php endif;?>‘,
‘{$%%}‘               =>   ‘<?=$\1;?>‘,
‘{foreach %%} ‘     =>    ‘<?php foreach(\1) :?>‘,
‘{/foreach}‘           =>    ‘<?php endforeach;?>‘,
‘{for %%}‘           =>    ‘<?php for(\1):?>‘,
‘{/for}‘                 =>    ‘<?php endfor;?>‘,
‘{while %%}‘        =>    ‘<?php while(\1):?>‘,
‘{/while}‘              =>   ‘<?php endwhile;?>‘,
‘{continue}‘          =>   ‘<?php continue;?>‘,
‘{break}‘              =>   ‘<?php break;?>‘,
‘{$%% = $%%}   =>  ‘<?php $\1 = $\2;?>‘,
‘{$%%++}‘         =>   ‘<?php $\1++;?>‘,
‘{$%%--}‘            =>    ‘<?php $\1--;?>‘,
‘{comment}‘         =>    ‘<?php /* ‘,
‘{/comment}‘        =>    ‘ */ ?>‘,
‘{/*}‘                    =>   ‘<?php /* ‘,
‘{*/}‘                       =>    ‘* ?>‘,
‘{section}‘                =>   ‘<?php ‘,
‘{/section}‘               =>   ‘?>‘,
‘{include %%}‘          =>   ‘<?php include \1;?>‘,

];

$file = file_get_contents($path);

foreach ($keys as $key => $val) {

$pattern = ‘#‘. str_replace(‘%%‘, ‘(.+)‘, preg_quote($key,‘#‘)) .‘#imsU‘;

$replace = $val;

if (stripos($pattern,‘include‘)) {

$file = preg_replace_callback($pattern, ‘parseInclude‘, $file);

} else{

$file = preg_replace($pattern, $replace, $file);
}

}

return $file;
}

function parseInclude($data)
{

$path = str_replace(array(‘\‘‘,‘"‘),‘‘,$data[1]);
//data[1]就是-------footer.html

$cacheFileName = parsePath($path);

display($path);

return ‘<?php include "‘.$cacheFileName.‘";?>‘;

}

4,模板 moban.html

<html>
<head>
<title>{$title}</title>
</head>

<body>

{$content}

<br />

{foreach $data as $key => $value}
{$key} ------{$value} <br />

{/foreach}

<hr />
<h1>这是这是是这是脚本</h1>

{include footer.html}

</body>

</html>

时间: 2025-01-12 01:34:03

php基本的模板引擎的相关文章

artTemplate模板引擎学习实战

在我的一篇关于智能搜索框异步加载数据的文章中,有博友给我留言,认为我手写字符串拼接效率过低,容易出错.在经过一段时间的摸索和学习之后,发现现在拼接字符串的方法都不在是自己去书写了,而是使用Javascript引擎.而javascript引擎的实质就是帮我们把带有JavaScript代码的伪THTML语句编译为HTML. 如果有不了解的朋友,可以前往这两篇文章: 淘宝购物车页面 PC端和移动端实战 淘宝购物车页面 智能搜索框Ajax异步加载数据 源码地址: GitHub:Uncle-Keith 回

使用模块化思维和模板引擎搭建前端架构(require+underscore)

require.js 介绍: 是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一.最新版本的RequireJS压缩后只有14K,堪称非常轻量. 官网:http://www.requirejs.cn/    (PS:如果没接触过,刚开始看都是一头蒙蔽的,建议看下菜鸟教程) 新手教程:http://www.runoob.com/w3cnote/requirejs-tutorial-1.html 优点:可完成团队协作.模块复用.单元测试等等一系列复杂的需求 undersco

《开源框架那点事儿25》:对框架模板引擎实现方式的改造实录

点滴悟透设计思想,Tiny模板引擎优化实录! 增加框架设计兴趣小组:http://bbs.tinygroup.org/group-113-1.html Tiny模板引擎的实现方式原来是採用的编译方式,近期发生了一些问题.因此我认为有必要把编译方式调整为解释方式,为此就開始了此次实现活动. 编译方式存在的问题 当时採用编译方式.主要是考虑到编译方式在执行时不必再去遍历语法树.因此就採用了编译方式. 可是在实际应用其中,出现了例如以下问题: 文件路径冲突的问题 因为採用的是编译方式,这个时候就存在在

php模板引擎的原理与简单实例

模板引擎其实就是将一个带有自定义标签的字符串,通过相应的规则解析,返回php可以解析的字符串,这其中正则的运用是必不可少的,所以要有一定的正则基础.总体思想,引入按规则写好的模板,传递给标签解析类(_HtmlTag)进行解析,再把解析好的字符串传递给php进行解析渲染输出首先定义了一个_HtmlTag类: class _HtmlTag{ protected $taglist = "if|elseif|else|loop|for|while|=|:=|:e|:html|:"; prote

前端学PHP之Smarty模板引擎

前面的话 对PHP来说,有很多模板引擎可供选择,但Smarty是一个使用PHP编写出来的,是业界最著名.功能最强大的一种PHP模板引擎.Smarty像PHP一样拥有丰富的函数库,从统计字数到自动缩进.文字环绕以及正则表达式都可以直接使用,如果觉得不够,SMARTY还有很强的扩展能力,可以通过插件的形式进行扩充.另外,Smarty也是一种自由软件,用户可以自由使用.修改,以及重新分发该软件.本文将详细介绍Smarty模板引擎 概述 Smarty是一个php模板引擎.更准确的说,它分离了逻辑程序和外

Django基础,Day10 - template 模板引擎与路径设置

作为一个Web框架,Django需要一个方便的方式来生成动态的HTML.最常见的方法依赖于模板.模板包含所需的HTML输出的静态部分以及一些特殊的语法描述如何插入动态内容. Django框架后端默认支持自生内置的一套模板系统DTL(Django Template Language) 和 有名的Jinja2模板系统.当然,也可以从第三方模块中之前其他模板系统.如果没有特殊要求,建议使用Django自带的DTL模板系统,这也是django 1.8之前唯一可以的内置选项. TEMPLATE 默认配置

模板引擎(smarty)知识点总结II

今天咱们继续来学习smarty!!! 知识点1:对于三种变量 常量的引用 有哪三种变量?a.assign赋值 b.系统保留变量(包括:$smarty.get,$smarty.post,$smarty.cookie,$smarty.session,$smarty.file,$smarty.request,$smarty.server,$smarty.env)c.配置文件   一般配置文件以.conf为主 $id = $_GET['id']?(int)$_GET['id']:0; #要在html页面

Spring Boot基础教程8-web应用开发-模板引擎jsp

一.spring boot的web应用开发,是基于spring mvc 二.Spring boot 在spring默认基础上,自动配置添加了以下特性: 1.   包含了ContentNegotiatingViewResolver和BeanNameViewResolver beans. 2.   对静态资源的支持,包括对WebJars的支持. 3.   自动注册Converter,GenericConverter,Formatter beans. 4.   对HttpMessageConverte

artTemplate模板引擎的源码拜读

最初接触的模板引擎还是基于node的ejs,当时觉得很神奇原来还可以这么玩,后来随着学习的深入,使用过jade,doT等,当然还有一些比较火的诸如juicer.underscore还没有深入接触,直到今年上半年由于项目需要就想着要不试试腾讯的artTemplate,感觉牛逼也吹的挺响的.开始了解后,觉得它比我之前使用过的jade.doT都好用,调试神马的也方便很多,采用预编译的方式也让性能非常优越. 其实看了源码后简单的总结出来就是这么一句话:就是先获取html中对应的id下得innerHTML

Smarty模板引擎技术(一)

一.Smarty模板引擎简介 什么是smarty? Smarty是采用php写的一个模版引擎,设计的目的是要将php代码与html代码分离,使php程序员只专注于php代码的编写,网页美工只专注于网页的美化 没有模版引擎时出现的问题? html中php代码比重越来越大 页面的数量越来越多 程序设计与美工设计分工不明确 传统的php文件: 1. php代码跟html混编在一起,不利于程序员和美工的分工,程序员和美工不能同时修改一个文件 2.数据的传递同一页面传递,php数据在页面中的显示需要使用p