PHP如何编写模板引擎?

时间:2012-07-07 16:55:31

标签: php string templates token

编辑:也许我应该明确这一部分。用户正在编写模板。所以我希望语法很简单,我不能用强大的模板引擎来信任它们。

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

示例: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);

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

2 个答案:

答案 0 :(得分:0)

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

令牌替换

Hello {{first_name}}

条件逻辑

尽管Mustache.js自称为“无逻辑”,但

  

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

您可以在控制器中进行基于逻辑的决策,然后将这些决策传递给视图 - 请参阅How do I accomplish an if/else in mustache.js?。所以,在你的情况下,这样的事情应该有效:

function( view ){

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

   // more template stuff...

}

答案 1 :(得分:0)

使用每个人的评论,我能够弄清楚如何使用自定义语法快速创建自己的安全模板引擎。

如果设置了{first_name|buddy},我想让{$first_name|default:"buddy"}成为first_name变量,但如果未设置,则使用字符串&#34; buddy&#34;默认情况下。

使用强大的模板引擎,如Smarty。 Smarty支持这一点,但我不喜欢语法preg_replace('/{([\w\s]+)\|([\w\s]+)}/', '{\$$1|default:"$2"}', $content);

使用正确的语法

替换所有出现的自定义语法
{{1}}

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