【发布时间】:2019-01-11 20:19:06
【问题描述】:
我目前正在使用自己的模板系统,我需要将变量分配给它们的占位符,这些占位符稍后将被替换。不幸的是,目前还不能直接在模板中使用 if/else 之类的条件。我总是必须在 PHP 中处理这个问题,并且需要将最终值分配给模板。
它目前在 php 中的情况:
$template->assign('{content}', ($b ? 'value' : 'value2')),在 html 中:<div>{content}</div>
我想要的:
<div><?php echo ($b ? 'value' : 'value2'); ?></div> 或 <div><?php echo ($b ? 'value' : $this->renderAnotherTemplate()); ?></div>
我可以使用 .php-files 或类似的东西,但据我记得,模板文件名在 url 中可见。所以我需要一种方法,从模板文件中读取字符串,执行它的 php 并访问我在解析器中使用的当前变量(eval 很危险)。
你们中的任何人有一个好主意,如何做到这一点?
谢谢!
【问题讨论】:
-
几乎没有可靠的方法让解析器运行 php 代码而不使其本质上只是一个 eval(例如包含)。您最好的办法是找出如何以您自己的方式使用 if/else 语句,或者使用已经这样做的现有模板系统。您自己的方式将取决于您,但您实际上是在编写自己的语言解析系统。
-
@Jonathan 是的,我已经意识到这一点,但我希望有另一种方法。 ://
-
您可以通过某种方式为占位符分配一个回调函数,以便在渲染时对其进行评估。
-
此外,eval/include 也不是很好,但只有在您无法控制正在渲染的文件时才会真正危险。如果它们不是用户提交的模板,则包含 php 文件没有任何问题。它与在系统中包含任何其他文件(无论是否包含模板)一样安全。
标签: php html parsing templates conditional-statements