【问题标题】:Replacing tokens in a PHP applications替换 PHP 应用程序中的令牌
【发布时间】:2013-10-17 20:35:00
【问题描述】:

我正在为我们的内部目的创建一个小型模板引擎。我们有几个 HTML 模板,其中包含 {token.name.value} 形式的令牌。我们将它提交给后端,然后后端会做它的事情并用相应的值替换令牌。但是,这是一个漫长的过程,并且在模板不起作用的情况下,会有很多来回。

所以,我正在考虑在数据库或 json 文件中将所有令牌作为 {key:value} 对。然后我们可以选择模板和 json 字典文件,应用程序可以使用字典文件替换模板中的标记并向我们显示输出。

我可以做其余的事情,但我不确定如何替换模板中的标记。我应该如何解析 html 模板?是否推荐使用 preg_replace 函数?

谢谢。

【问题讨论】:

  • 很多现有的模板引擎有问题吗?
  • 你推荐哪一个?我经历了一些,但我无法决定它们是否是最好的路线。如果是,那么哪一个最适合我正在尝试做的事情。
  • 我不想说“你为什么要重新发明轮子?”,但说真的,除非你有一些真正好的观点,否则创建一个自制的模板引擎是不值得的。 smarty.net 很不错。
  • 我也是 smarty 的粉丝......在我作为 php 开发人员的生活中,有一个“smarty 之前和之后”的点。
  • 我知道我可以使用模板引擎,但他们没有自己的令牌格式吗?我需要放置类似于这种格式 {token.name.value} 的令牌。他们让我选择标记的格式吗?

标签: php template-engine


【解决方案1】:

IHMO 似乎您需要一个真正的模板引擎来满足您的用例,例如出色的 TwigSmarty。它们将使您的生活更轻松,无需担心模板代码的解析和移动方式,让您专注于应用程序逻辑。

但有时不必处理成熟的模板语言并且仍然能够替换简单的键:值对可能是实际的。对于那些特定的、狭窄的用例,这里有一个我使用的小辅助函数。

function replace_tokens($html) {
  $token_format = '/{([^}]+)}/';

  preg_match_all($token_format, $html, $matches, PREG_SET_ORDER);

  foreach ($matches as $match) {
    switch ($match[1]) {
      case 'token.one':
        $html = preg_replace('/' . $match[0] . '/', 'Value One !', $html, 1);
        break;

      case 'token.two':
        $html = preg_replace('/' . $match[0] . '/', 'Value Two.', $html, 1);
        break;

      default:
        break;
    }
  }

  return $html;
}

它又快又脏,但它完成了解析工作。 switch 部分是可选的,有很多更好的方法可以将您的 {key} 匹配项与实际密钥进行比较。

【讨论】:

  • 问题是如果我有一百个令牌,那么我将不得不写一百个开关案例?我想将这些标记放在 JSON 文件中,然后将其用作字典。我检查了 smarty,但 Smarty 令牌格式与我尝试使用的有点不同。虽然我认为那里也可能有一种方法。
  • @Leon 不,您根本不必使用switch。您可以使用关联数组并在 for 循环中检查数组中是否存在 $match[1] 键,并在找到匹配项时将标记替换为关联值。但是如果你在谈论 数百 个标记,你真的应该使用一个成熟的模板引擎。为了性能而不是重新发明轮子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2021-11-19
  • 2012-04-10
  • 2014-07-12
  • 2019-12-31
  • 2015-02-08
  • 1970-01-01
相关资源
最近更新 更多