Overview
大约在 2009 年底,我为 PHP/HTML 编写了一个简单的模板系统,供我们的设计人员在内部使用小册子软件类型的网站。该系统的目标是允许通过由 PHP 处理的自定义标签在其他纯 HTML 中进行模板化。例如,模板化页面可能如下所示:
<tt:Page template="templates/main.html">
<tt:Content name="leftColumn">
<p> blah blah </p>
...
</tt:Content>
<tt:Content name="rightColumn">
<p> blah blah </p>
...
</tt:Content>
</tt:Page>
模板本身可能看起来像这样:
<html>
<head>...</head>
<body>
<div style="float:left; width:45%">
<tt:Container name="leftColumn" />
</div>
<div style="width:45%">
<tt:Container name="rightColumn" />
</div>
</body>
</html>
除了页面和内容/容器标签之外,核心中还包含一些其他标签,用于流量控制、迭代集合、输出动态值等。该框架的设计使得您可以很容易地添加自己的一组标签在另一个前缀和命名空间下注册的标签。
PHP 的自定义标签
我们如何解析这些自定义标签?由于无法保证 HTML 文件是格式良好的 XML,因此 XSLT/XPATH 等解决方案并不可靠。相反,我们使用正则表达式来查找具有已注册前缀的标签,并将其替换为 PHP 代码。 PHP 代码是基于堆栈的设计......在遇到开始标记时,会创建一个表示该标记的对象并将其推送到堆栈上,并且其“初始化函数”(如果有)运行。每当遇到注册的结束标记时,最新的对象就会从堆栈中弹出,并且其“渲染函数”运行。
因此,在框架用 PHP 替换模板标签后,我们的示例页面可能看起来像这样(实际上它有点难看):
<?php $tags->push('tt', 'Page', array('template'=>'templates/main.html')); ?>
<?php $tags->push('tt', 'Content', array('name'=>'leftColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->push('tt', 'Content', array('name'=>'rightColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->pop(); ?>
好的、坏的以及eval
现在,如何执行我们新生成的 PHP 代码?我在这里可以想到几个选择。最简单的就是简单地eval
字符串,效果很好。然而,任何程序员都会告诉你“eval 是邪恶的,不要使用它......”所以问题是,还有什么比eval
我们可以在这里使用吗?
我考虑过使用临时文件或缓存文件,使用php://
输出流等,但据我所知,这些并没有提供任何真正的优势eval
。缓存可以加快速度,但实际上我们在这方面拥有的所有网站都已经非常快了,所以我认为此时没有必要进行速度优化。
问题
对于此列表中的每件事:这是一个好主意吗?你能想出更好的选择吗?
- 总体思路(html / php 的自定义标签)
- 将标签转换为php代码而不是直接处理
- 基于堆栈的方法
- 指某东西的用途
eval
(或类似)
感谢您的阅读以及 TIA 的建议。 :)