1

编辑:也许我应该把这部分说清楚。用户正在编写模板。所以我希望语法简单,我不能相信他们有强大的模板引擎。

所以,我需要一个模板引擎,用于编写电子邮件,使用令牌(简单)和条件逻辑(不太容易)。

例子:Hello{if first_name} dear {first_name}{endif}, blah blah blah.

如果 first_name 不可用,则应为:Hello, blah blah blah.

我能够使用 eval 让它工作......但我们都知道 eval 是邪恶的。

$body = preg_replace('/{if ([^{\|}]+)}/i', '<?php if(isset(\$tokens[\'$1\'])):?>', $body);
$body = preg_replace('/{endif}/i', '<?php endif;?>', $body);

谁能指点我这个教程?除了简单的令牌替换,我似乎找不到任何东西。

4

2 回答 2

0

如上所述,我会为此使用 Mustache.js,它应该可以完成您需要的一切。如果您想要的只是“令牌替换和条件逻辑”,Mustache 可用于同时提供:

令牌替换

Hello {{first_name}}

条件逻辑

尽管 Mustache.js 将自己标榜为“无逻辑”,

我们称其为“无逻辑”,因为没有 if 语句、else 子句或 for 循环。

您可以在控制器中做出基于逻辑的决策,然后将这些决策传递给视图——请参阅如何在 mustache.js 中完成 if/else?. 所以,在你的情况下,这样的事情应该有效:

function( view ){

   if ( logged_in ) {
     var user = {
       first_name: "Jane",
       last_name: "Doe"
     };
   } else {
     var user = {
       first_name: "Buddy"
     };
   }

   // more template stuff...

}
于 2012-07-09T13:09:37.567 回答
0

使用大家的评论,我能够弄清楚如何使用自定义语法快速制作我自己的安全模板引擎。

假设如果设置了 first_name 变量,我想将{first_name|buddy}其设为变量,但如果未设置,则使用字符串“buddy”作为默认值。

使用强大的模板引擎,例如 Smarty。Smarty 对此有支持,但我不喜欢这种语法{$first_name|default:"buddy"}

用正确的语法替换所有出现的自定义语法

preg_replace('/{([\w\s]+)\|([\w\s]+)}/', '{\$$1|default:"$2"}', $content);

然后通过 Smarty 运行它。这与使用 eval 基本相同,但安全。多谢你们。

于 2012-07-10T15:00:08.900 回答