Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP占位符正则表达式_Php_Regex_String - Fatal编程技术网

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