Php 递归正则表达式:如何设置与字符串而不是单个字符的不匹配

Php 递归正则表达式:如何设置与字符串而不是单个字符的不匹配,php,regex,preg-match-all,Php,Regex,Preg Match All,我的php代码: $exp = 'zzz<pre>sssss<pre>fff</pre>ff</pre>zzz'; \preg_match_all("#<pre>((?>[^(?:<pre>)(?:</pre>)]|(?R))*)</pre>#si", $exp, $matches); $i = 0; for

我的php代码:

      $exp = 'zzz<pre>sssss<pre>fff</pre>ff</pre>zzz';     
      \preg_match_all("#<pre>((?>[^(?:<pre>)(?:</pre>)]|(?R))*)</pre>#si", $exp, $matches);

        $i = 0;
        foreach ($matches as $item) {           
            foreach ($item as $elem)
            {
                echo "$i  ", \htmlentities($elem), "<br>";
            }
            $i++;
        }
ffzzz;//ssspss中的p

输出

0

1 fff


告诉我,如何构建正则表达式以设置与字符串的不匹配,而不是单个字符的不匹配?

您可能希望使用a而不是:

您的正则表达式未按预期工作,因为[^?:]与[^negated]中未包含的任何字符匹配。任何不属于下列字符之一的字符:


SeNoTo: ReEX不适合解析任意嵌套的HTML。考虑.< /P> < P>可能您想使用A代替:

您的正则表达式未按预期工作,因为[^?:]与[^negated]中未包含的任何字符匹配。任何不属于下列字符之一的字符:


SeNoTo: ReEX不适合解析任意嵌套的HTML。考虑.< /P>谢谢您的帮助,特别是对ReGEX101.COM的帮助,特别是对于ReGEX101.com的链接

[^(?:<pre>)(?:</pre>)]
~<pre>((?>(?!</?pre).|(?R))*)</pre>~si