我正在为自定义CMS /新闻系统创建一个非常简单的PHP模板系统。每篇文章都有介绍和完整内容(如果适用)。我希望以这种形式为条件:
{continue}click to continue{/continue}
因此,如果可以继续,将显示“单击以继续”文本,否则,不显示整个字符串。到目前为止,它的工作原理如下:如果我们可以继续,请删除{continue}标记;否则,删除整个事情。
我目前正在使用preg_match_all
来匹配第二种情况下的字符串。删除匹配文本的最佳功能是什么?一个简单的str_replace
,还是别的什么?
或者有更好的方法来实现这个整体吗?
答案 0 :(得分:5)
为什么不使用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非常有用。
答案 1 :(得分:2)
对不起我知道人们一直在嘲笑这种答案,但只是使用Smarty。它简单,稳定,巧妙,免费,小巧便宜。花一个小时学习如何使用它,你永远不会回头。
答案 2 :(得分:1)
对于PHP模板系统,正确的方法是解析模板(使用状态机或至少preg_split
),从中生成PHP代码,然后仅使用该PHP代码。然后,您将能够将正常if
用于条件表达式。
正则表达式不是实现模板的好主意。 PITA将处理嵌套并在基本情况之外强制执行适当的语法。性能将非常差(您必须小心不要创建回溯表达式,即使这样,您最终也会多次扫描和复制模板的KB)。