假设使用标签形式作为模板语法

在解析环节我想到两种实现方式

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模板引擎如何实现相关推荐

  1. php模板引擎如何实现,php模板引擎技术简单实现

    用了smarty,tp过后,也想了解了解其模板技术是怎么实现,于是写一个简单的模板类,大致就是读取模板文件->替换模板文件的内容->保存或者静态化 tpl.class.php主要解析 as ...

  2. 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)

    前些时间在看创智博客韩顺平的Smarty模板引擎教程,再结合自己跟李炎恢第二季开发中CMS系统写的tpl模板引擎.今天就写一个迷你版的Smarty引擎,虽然说我并没有深入分析过Smarty的源码,但是 ...

  3. 使用 .NET Core模板引擎创建自定义的模板和项目

    本文要点 .NET CLI 包含了一个模板引擎,它可以直接利用命令行创建新项目和项目项.这就是"dotnet new"命令. 默认模板集涵盖了默认控制台和基于 ASP.NET 的应 ...

  4. 自定义 Javascript 模板规则,打造轻量级模板引擎

    直接贴 TemplateHelper 代码了: var TemplateHelper = {englishChars: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",b ...

  5. twig模板引擎使用php,Twig模板引擎

    使用Twig Twig是一个灵活,快速,安全的PHP模板语言.它将模板编译成经过优化的原始PHP代码.Twig拥有一个Sandbox模型来检测不可信的模板代码.Twig由一个灵活的词法分析器和语法分析 ...

  6. 模板引擎ejs与html,后台模板引擎ejs与前台模板引擎artTemplate的简单介绍

    动态网页是指前端页面当中的数据内容来源于后台数据库,前端的html代码会随着后台数据的变化而变化,是动态生成的.制作动态网页有两种方式,一种方式是在后台拿到前端的html模板,利用后台模板引擎(如ej ...

  7. 什么是模板引擎?常见的模板引擎有哪些?Thymeleaf的常用指令介绍。

    1.模板引擎是什么? 模板引擎是以业务逻辑层和表现层分离为目的的,将规定格式的模板代码转换为业务数据的算法实现. 它可以是一个过程代码.一个类,甚至是一个类库.不同的模板引擎其功用也不尽相同,但其基本 ...

  8. 什么是模板引擎?常见的模板引擎有哪些?thymeleaf的常用指令介绍

    一.模板引擎概念 模板引擎是为了解决用户界面(显示)与业务数据(内容)分离而产生的. 它可以生成特定格式的文档,常用的如格式如HTML.xml以及其他格式的文本格式.其工作模式如下: 举个例子,我想买 ...

  9. 提高开发效率之安卓模板(上面有四种模板的教程,我之前会两种,看完之后还是只会两种2333)

    原文地址: juejin.im/post/5c7339- 在平时的开发工作中,我们经常将一个地方的代码,复制粘贴到另外一个地方,俗称搬砖,搬砖搬多了,作为一个资深的挨踢民工,难免会总结一些提高生产力的 ...

最新文章

  1. 微信小程序开发视频教程新鲜出炉
  2. CEPH FILESYSTEM
  3. django-自定义转换器-实操案例
  4. html表单的课后心得体会,web前端学习心得体会范文
  5. Linux基础知识题解答(四)
  6. re模块常用修饰符_re模块中常用功能函数
  7. nginx虚拟机无法访问解决
  8. 云创大数据荣获“南京实体经济十大优秀企业”
  9. 浅谈Event Loop
  10. 【巧用百度地图】—百度地图生成器(直接获取代码)
  11. 用C语言将四个数字排列顺序(不重复)
  12. 从招股书看蚂蚁集团的技术底色
  13. 解决缺少 SHA256.h文件
  14. 浙江工业大学 计算机学院,刘端阳-浙江工业大学计算机学院.DOC
  15. TP、TN、FP、FN、Recall、Miss Rate、MCC、F1 Score 等指标计算
  16. Echarts 雷达简单应用
  17. Python批量转换文件夹下图片为PDF
  18. 2021-2025年中国军用浮桥行业市场供需与战略研究报告
  19. 解密韦德之膝:康复因再世华佗
  20. java实现第七届蓝桥杯四平方和

热门文章

  1. 微服务权限控制(二)共享Session方式的登录认证
  2. python opencv 内存泄露_python - OpenCV Python裁剪图像 - 堆栈内存溢出
  3. comsol如何定义狄利克雷边界_如何使用拓扑优化结果创建几何模型
  4. Elasticseach 从零开始学习记录(三) - 分布式部署
  5. 了解和使用DotNetCore和Blazor中的异步编程
  6. .NET Standard中使用TCPListener和TCPClient的高性能TCP客户端服务器
  7. 向.NET Core项目添加EntityFrameworkCore支持
  8. Angular 7 和 .Net Core 2.2——全球天气(第1部分)
  9. php无限极 left right,php无限极分类实现的两种解决方法
  10. vue引入全局静态变量_vue-cli4 全面配置(持续更新)