PHP占位符正则表达式

时间:2014-05-13 16:12:20

标签: php regex string

我的正则表达式返回错误的字符串

preg_replace_all("/\{\{([^W]+)\}\}/", $this->outputHtml,$matches);

我正在尝试匹配模板中具有{{this}}语法的占位符。 我得到的匹配是首次出现{{和最后}},其间包含大量html的所有文字。

3 个答案:

答案 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);