概述
大约在 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>
除了 Page 和 Content/Container 标签之外,核心中还包含一些其他标签,用于流控制、迭代集合、输出动态值等。该框架的设计使得添加您自己的一组非常容易在另一个前缀和命名空间下注册的标签。
自定义标签到 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 的任何建议。:)