php模板引擎如何实现,PHP模板引擎如何实现
假设使用标签形式作为模板语法
在解析环节我想到两种实现方式
1. 利用正则获取标签内容,然后将标签进行规则性的替换并使用eval进行解析,解析完成后再用正则进行替换
2. 利用正则获取标签内容,然后将标签进行规则性的替换,替换完成后使用cli执行脚本并返回内容
现在的问题是,不太清楚整个流程和这两种实现方式是否正确,或者有别的方式。
谢谢
回复内容:
假设使用标签形式作为模板语法
在解析环节我想到两种实现方式
1. 利用正则获取标签内容,然后将标签进行规则性的替换并使用eval进行解析,解析完成后再用正则进行替换
2. 利用正则获取标签内容,然后将标签进行规则性的替换,替换完成后使用cli执行脚本并返回内容
现在的问题是,不太清楚整个流程和这两种实现方式是否正确,或者有别的方式。
谢谢
简单理解一下,是这样的
file.html就是file.php的模板
再换个思路是这样的
{{var}}
摘自Slim:
protected function render($template, $data = null)
{
$templatePathname = $this->getTemplatePathname($template);
if (!is_file($templatePathname)) {
throw new \RuntimeException("View cannot render `$template` because the template does not exist");
}
$data = array_merge($this->data->all(), (array) $data);
extract($data);
ob_start();
require $templatePathname;
return ob_get_clean();
}
拿到数据之后要进一步处理还是display就看你自己了
举个简单的列子给你吧
tpl_dir = $tpl_dir;
if(isset($cache_dir))$this->cache_dir = $cache_dir;
if(isset($tpl_ext))$this->tpl_ext = $tpl_ext;
if(isset($var_left))$this->var_left = $var_left;
if(isset($var_right))$this->var_right = $var_right;
}
function load($tplfilename) {
$tplfile = $this->tpl_dir.'/'.$tplfilename.$this->tpl_ext;
if(!file_exists($tplfile))
die('Template not found: '.$tplfile);
return $this->cache($tplfilename, $tplfile);
}
//判断模板是否缓存,如模板文件有更改则重新编译
function cache($tplname, $tpl_file) {
$cache_file = $this->cache_dir.'/'.md5($tplname).'.php';
if(!file_exists($cache_file) || filemtime($tpl_file)>filemtime($cache_file))
$this->compile($tpl_file, $cache_file);
return $cache_file;
}
//编译模板内容到PHP格式,并写入缓存
function compile($tpl, $cache) {
$body = file_get_contents($tpl);
$vl = $this->var_left;
$vr = $this->var_right;
$patterns = array(
"#$vl\s*include:(.+?)\s*$vr#i",
"#$vl\s*if\s+(.+?)\s*$vr#i",
"#$vl\s*else\s*$vr#i",
"#$vl\s*elseif\s+(.+?)\s*$vr#i",
"#$vl\s*endif\s*$vr#i",
"#$vl\s*/if\s*$vr#i",
"#$vl\s*foreach\s+(.+?):(.+?)\s*$vr#i",
"#$vl\s*endforeach\s*$vr#i",
"#$vl\s*/foreach\s*$vr#i",
"#$vl([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)$vr#i",
"#$vl([0-9a-zA-Z_]+?)\.([0-9a-zA-Z_]+?)$vr#i",
"#$vl([0-9a-zA-Z_\[\]\'\"]+?)$vr#i",
"#$vl([0-9a-zA-Z_]+?):(.*?)$vr#i"
);
$replacements = array(
"",
"",
"",
"",
"",
"",
"0):\$autoindex=0;foreach($\\1 as \\2):\$autoindex++; ?>",
"",
"",
"",
"",
"",
""
);
$body = preg_replace($patterns, $replacements, $body);
file_put_contents($cache, "".$body);
}
}
$view = new view();
function show($tpl) {
global $view;
return $view->load($tpl);
}
?>
上面就是一个模版引擎了,看看如何使用
php 使用示例
'rows','b'=>array('c'=>'inarray'));
include show('index');
?>
模版使用示例
{title}
你好,仅供参考
{a.a}
{a.b.c}
{foreach a:$v}
{autoindex}.{v}
{/foreach}
{include:footer}
PHP 本身就可看作一個「模板引擎」。
=$title?>
=$main?>
只要:
$title = 'test'; $main = '';
require('template.inc.php');
即可。
如需要得到內容而非直接輸出,只要:
ob_start();
$title = 'test'; $main = '';
require('template.inc.php');
$content = ob_get_clean();
包裝成函數,從功能上看,算不算用 PHP 實現了模板引擎呢?
php模板一般是翻譯型,是把特定的文件翻譯成php或html,然後輸出的是那個文件的結果
php本身可以看作是C语言的模板。。。
楼主说的模板引擎,大抵都是用正则表达式实现的。
{$user_name}--->正则匹配--->
没什么太高深的东西在里面,如果你愿意,直接采用原生模式嵌入到html即可,毕竟正则效率也不是那么高
我很多年前写的c++版本,供参考,实现比较土,编译原理都还给老师了
https://github.com/pi1ot/webapplib/blob/master/waTemplate.h
https://github.com/pi1ot/webapplib/blob/master/waTemplate.cpp
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
php模板引擎如何实现,PHP模板引擎如何实现相关推荐
- php模板引擎如何实现,php模板引擎技术简单实现
用了smarty,tp过后,也想了解了解其模板技术是怎么实现,于是写一个简单的模板类,大致就是读取模板文件->替换模板文件的内容->保存或者静态化 tpl.class.php主要解析 as ...
- 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
前些时间在看创智博客韩顺平的Smarty模板引擎教程,再结合自己跟李炎恢第二季开发中CMS系统写的tpl模板引擎.今天就写一个迷你版的Smarty引擎,虽然说我并没有深入分析过Smarty的源码,但是 ...
- 使用 .NET Core模板引擎创建自定义的模板和项目
本文要点 .NET CLI 包含了一个模板引擎,它可以直接利用命令行创建新项目和项目项.这就是"dotnet new"命令. 默认模板集涵盖了默认控制台和基于 ASP.NET 的应 ...
- 自定义 Javascript 模板规则,打造轻量级模板引擎
直接贴 TemplateHelper 代码了: var TemplateHelper = {englishChars: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",b ...
- twig模板引擎使用php,Twig模板引擎
使用Twig Twig是一个灵活,快速,安全的PHP模板语言.它将模板编译成经过优化的原始PHP代码.Twig拥有一个Sandbox模型来检测不可信的模板代码.Twig由一个灵活的词法分析器和语法分析 ...
- 模板引擎ejs与html,后台模板引擎ejs与前台模板引擎artTemplate的简单介绍
动态网页是指前端页面当中的数据内容来源于后台数据库,前端的html代码会随着后台数据的变化而变化,是动态生成的.制作动态网页有两种方式,一种方式是在后台拿到前端的html模板,利用后台模板引擎(如ej ...
- 什么是模板引擎?常见的模板引擎有哪些?Thymeleaf的常用指令介绍。
1.模板引擎是什么? 模板引擎是以业务逻辑层和表现层分离为目的的,将规定格式的模板代码转换为业务数据的算法实现. 它可以是一个过程代码.一个类,甚至是一个类库.不同的模板引擎其功用也不尽相同,但其基本 ...
- 什么是模板引擎?常见的模板引擎有哪些?thymeleaf的常用指令介绍
一.模板引擎概念 模板引擎是为了解决用户界面(显示)与业务数据(内容)分离而产生的. 它可以生成特定格式的文档,常用的如格式如HTML.xml以及其他格式的文本格式.其工作模式如下: 举个例子,我想买 ...
- 提高开发效率之安卓模板(上面有四种模板的教程,我之前会两种,看完之后还是只会两种2333)
原文地址: juejin.im/post/5c7339- 在平时的开发工作中,我们经常将一个地方的代码,复制粘贴到另外一个地方,俗称搬砖,搬砖搬多了,作为一个资深的挨踢民工,难免会总结一些提高生产力的 ...
最新文章
- 微信小程序开发视频教程新鲜出炉
- CEPH FILESYSTEM
- django-自定义转换器-实操案例
- html表单的课后心得体会,web前端学习心得体会范文
- Linux基础知识题解答(四)
- re模块常用修饰符_re模块中常用功能函数
- nginx虚拟机无法访问解决
- 云创大数据荣获“南京实体经济十大优秀企业”
- 浅谈Event Loop
- 【巧用百度地图】—百度地图生成器(直接获取代码)
- 用C语言将四个数字排列顺序(不重复)
- 从招股书看蚂蚁集团的技术底色
- 解决缺少 SHA256.h文件
- 浙江工业大学 计算机学院,刘端阳-浙江工业大学计算机学院.DOC
- TP、TN、FP、FN、Recall、Miss Rate、MCC、F1 Score 等指标计算
- Echarts 雷达简单应用
- Python批量转换文件夹下图片为PDF
- 2021-2025年中国军用浮桥行业市场供需与战略研究报告
- 解密韦德之膝:康复因再世华佗
- java实现第七届蓝桥杯四平方和
热门文章
- 微服务权限控制(二)共享Session方式的登录认证
- python opencv 内存泄露_python - OpenCV Python裁剪图像 - 堆栈内存溢出
- comsol如何定义狄利克雷边界_如何使用拓扑优化结果创建几何模型
- Elasticseach 从零开始学习记录(三) - 分布式部署
- 了解和使用DotNetCore和Blazor中的异步编程
- .NET Standard中使用TCPListener和TCPClient的高性能TCP客户端服务器
- 向.NET Core项目添加EntityFrameworkCore支持
- Angular 7 和 .Net Core 2.2——全球天气(第1部分)
- php无限极 left right,php无限极分类实现的两种解决方法
- vue引入全局静态变量_vue-cli4 全面配置(持续更新)