【问题标题】:PHP how to write a template engine?PHP如何写一个模板引擎?
【发布时间】:2012-07-07 16:55:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 有什么理由要重新发明轮子而不是使用既定的解决方案?
  • 就像@raina77ow 说的,你为什么要重新发明轮子?特别是当您想要不那么简单的功能时。
  • Swift Mailer 是一个包含自己的电子邮件模板引擎的电子邮件发件人库。
  • 我已经编写了自己的模板引擎,但我是一位经验丰富的程序员,并且将其作为练习来满足非常具体的要求。如果不将错误和漏洞引入您的应用程序,它们很难有效实施。我还建议你坚持一个标准的
  • 看看 Twig。 twig.sensiolabs.org

标签: php string templates token


【解决方案1】:

如上所述,我会为此使用 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...

}

【讨论】:

  • 它的 php 实现更适合提出的问题。github.com/bobthecow/mustache.php
  • 嘿,这还不错。唯一的问题是需要在模板中指定默认值!使用此首选语法 {{first_name|buddy}} 如果未设置 first_name,则只需使用字符串 buddy
  • 我想我可以先自己解析字符串,找到默认值,将它们从字符串中删除,然后将它们存储在您向我展示的模板函数中。然后最后通过小胡子运行字符串?这有意义吗?
  • 那你说先解析什么字符串? (PS 编辑代码默认使用“好友”)
  • 解析这个字符串Hello {{first_name|buddy}}, blah blah. 用户将它绑定到一个文本区域,他们是定义默认值的那个;它并不总是相同的默认值。看到问题了吗?
【解决方案2】:

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

假设我想让 {first_name|buddy} 成为 first_name 变量(如果已设置),但如果未设置,则使用字符串“buddy”作为默认值。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多