PHP占位符正则表达式
我的正则表达式返回错误的字符串PHP占位符正则表达式,php,regex,string,Php,Regex,String,我的正则表达式返回错误的字符串 preg_replace_all("/\{\{([^W]+)\}\}/", $this->outputHtml,$matches); 我正在尝试匹配模板中具有{{this}}语法的占位符。 我得到的匹配结果是第一次出现{和最后一次},中间的所有文本都包含大量html。尝试使用?加上+使其变得不灵活,又称“懒惰”: preg_replace_all("/\{\{([^W]+?)\}\}/", $this->outputHtml,$matches);
preg_replace_all("/\{\{([^W]+)\}\}/", $this->outputHtml,$matches);
我正在尝试匹配模板中具有{{this}}语法的占位符。
我得到的匹配结果是第一次出现{和最后一次},中间的所有文本都包含大量html。尝试使用?加上+使其变得不灵活,又称“懒惰”:
preg_replace_all("/\{\{([^W]+?)\}\}/", $this->outputHtml,$matches);
那就把它弄得松松垮垮吧:
preg_replace_all("/\{\{([^\W]+)\}\}/U", $this->outputHtml,$matches);
U修饰符是一个PHP扩展,最初在Perl中不存在。参考文献:
编辑-对于替换模板中的重要变量,我通常采用另一种方式:因为我事先知道占位符名称,所以我只需查找文字标记,并将其替换为例如。例如:
懒散的重复回答效果很好,但我个人尽量避免,因为我们可以更具体地描述我们想要匹配的内容。我将使用: 这将捕获1+个非}字符,这意味着它将在看到结束}时立即停止。然而,这意味着{{foo}bar}}模板将无法工作,然而,我认为这不会是一个问题 实施:
你真的想匹配任何没有大写字母W的双花括号吗?@AD7six-Well-spot:你使用U修饰符有什么原因吗?我更喜欢吃什么?因此,阅读正则表达式的人会立即注意到贪婪与懒惰,而不必熟悉PHP的修饰符。@Sam-原因是什么?当贪婪很重要时,我通常希望整个表情都是贪婪。多次使用时,此语法较短,且标志突出。当用PHP编写代码时,我假设自己具备PHP知识。-除此之外,这是个人偏好的问题,Perl语法已经有了另一个答案。我还编辑了我的答案,以解释我如何解决模板需求。足够公平:-我为详细的解释添加了一个加号。旁注:没有说这比我之前的懒惰示例更好或更差;我只是想再看一眼。可能更好,因为它避免了懒惰答案遭受+1的任何回溯,你是对的,这比导致回溯的懒惰更有效。阅读一些你的正则表达式答案,干得好:谢谢@zx81,通过反复思考和回答问题,我学到了大部分正则表达式知识。
// Totally untested code
$from = $to = array();
foreach($values as $key => $value){
$from[] = "{{$key}}";
$to[] = $value;
}
... = strtr($this->outputHtml, $from, $to);
\{{2} (?# match 2 literal {)
( (?# start capture group)
[^}]+ (?# 1+ non } characters)
) (?# end capture group)
\}{2} (?# match 2 literal })
preg_replace_all("/\{{2}([^}]+)\}{2}/", $this->outputHtml, $matches);