【问题标题】:Best way to implement conditional in a PHP templating system?在 PHP 模板系统中实现条件的最佳方法?
【发布时间】:2009-03-29 19:10:10
【问题描述】:

我正在为自定义 CMS/新闻系统创建一个非常简单的 PHP 模板系统。每篇文章都有介绍和完整内容(如果适用)。我想有一个形式的条件:

{continue}click to continue{/continue}

因此,如果可以继续,则会显示“单击继续”文本,否则,不显示整个字符串。到目前为止,它是这样工作的:如果我们可以继续,删除 {continue} 标签;否则,删除整个东西。

我目前使用preg_match_all 来匹配第二种情况下的字符串。删除匹配文本的最佳功能是什么?一个简单的str_replace,还是别的什么?

或者有没有更好的方法来实现这一点?

【问题讨论】:

    标签: php regex string templates


    【解决方案1】:

    为什么不使用preg_replace_callback

    具体来说:

    preg_replace_callback('!\{continue\}(.*)\{/continue\}!Us', 'replace_continue', $html);
    
    function replace_continue($matches) {
      if (/* can continue */) {
        return $matches[1];
      } else {
        return '';
      }
    }
    

    我发现 preg_replace_callback 非常有用。

    【讨论】:

      【解决方案2】:

      对不起,我知道人们一直在嘲笑这种答案,但请使用 Smarty。它简单、稳定、聪明、免费、小巧且便宜。花一个小时学习如何使用它,您将永远不会回头。

      转到www.smarty.net

      【讨论】:

      • 我同意他应该只使用真正的模板引擎,但不要聪明:nosmarty.net
      • 哇,一个专门针对为什么有些人不喜欢聪明人的长篇大论的网站。 :)
      • 该页面的作者可能是正确的,但我对他们的任何观点都没有印象。替代品实际上也不是替代品,我上次检查时 Symfony 使用了大量的内联 php,只有 PHPTAL 是一种实际的模板语言。我也没有经历过这种错误。
      • 也许我的问题应该更清楚,但我并没有创建一个成熟的模板系统来允许用户创建/输出他们喜欢的任何变量。只有少数固定变量,如 {headline}、{content} 等。
      • 一旦你允许条件我会使用 smarty。
      【解决方案3】:

      对于 PHP 模板系统,正确的方法是解析模板(使用状态机或至少 preg_split),从中生成 PHP 代码,然后仅使用该 PHP 代码。然后你就可以使用普通的if 来表达条件表达式了。

      正则表达式不是实现模板的好主意。 PITA 将处理嵌套并在基本情况之外强制执行正确的语法。性能会很差(你必须小心不要创建回溯表达式,即使那样你最终也会多次扫描和复制 KB 的模板)。

      【讨论】:

      • 感谢您的建议,但这确实是一个非常简单的系统,我决定的固定常数不超过 8 个。没有复杂条件的范围,只有这个单一的“如果有意义则显示”。
      猜你喜欢
      • 2018-05-16
      • 2011-10-26
      • 2011-03-16
      • 2012-12-26
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 2017-05-23
      • 2013-04-06
      相关资源
      最近更新 更多