我的正则表达式返回错误的字符串
preg_replace_all("/\{\{([^W]+)\}\}/", $this->outputHtml,$matches);
我正在尝试匹配模板中具有{{this}}
语法的占位符。
我得到的匹配是首次出现{{
和最后}}
,其间包含大量html的所有文字。
答案 0 :(得分:4)
然后不成功:
preg_replace_all("/\{\{([^\W]+)\}\}/U", $this->outputHtml,$matches);
U
修饰符是最初不存在于Perl中的PHP扩展。参考:Pattern Modifiers。
编辑 - 对于大图片(模板中的变量替换),我通常会反过来:因为我事先知道了占位符名称,所以我只是寻找文字标签和用e.g.
good old strtr()
替换它们。 E.g:
// Totally untested code
$from = $to = array();
foreach($values as $key => $value){
$from[] = "{{$key}}";
$to[] = $value;
}
... = strtr($this->outputHtml, $from, $to);
答案 1 :(得分:3)
懒惰的重复答案效果很好,但我个人尽可能避免它(因为我们可以更多“具体”与我们想要匹配的东西)。我会使用this expression:
\{{2} (?# match 2 literal {)
( (?# start capture group)
[^}]+ (?# 1+ non } characters)
) (?# end capture group)
\}{2} (?# match 2 literal })
这会捕获1 + 非 - }
个字符,这意味着它会在看到结束}}
后立即停止。但是,这意味着{{foo}bar}}
模板不起作用(但是,我认为这不会是一个问题)。
<强>实施强>
preg_replace_all("/\{{2}([^}]+)\}{2}/", $this->outputHtml, $matches);
答案 2 :(得分:2)
尝试使用?
和+
使其成为不合适(也称为“懒惰”):
preg_replace_all("/\{\{([^W]+?)\}\}/", $this->outputHtml,$matches);