Php 递归正则表达式与模板块不匹配

Php 递归正则表达式与模板块不匹配,php,regex,pcre,Php,Regex,Pcre,我试图了解更多关于正则表达式的知识,在本例中,您可以在正则表达式中执行递归 我正在尝试匹配{foreach$VAR}的嵌套块。。。{/foreach}。但由于某些原因,我的正则表达式不匹配,我不明白为什么 我希望这里的任何人都能对此有所了解。我对快速修复正则表达式不感兴趣。但实际上更多的是我的正则表达式没有达到我期望的效果。到底发生了什么 这是我的代码: <?php $str = 'start of text {foreach $ABC} in 1st loop {foreach

我试图了解更多关于正则表达式的知识,在本例中,您可以在正则表达式中执行递归

我正在尝试匹配
{foreach$VAR}的嵌套块。。。{/foreach}
。但由于某些原因,我的正则表达式不匹配,我不明白为什么

我希望这里的任何人都能对此有所了解。我对快速修复正则表达式不感兴趣。但实际上更多的是我的正则表达式没有达到我期望的效果。到底发生了什么

这是我的代码:

<?php
$str = 'start of text
{foreach $ABC}
  in 1st loop
  {foreach $XYZ}
    in 2nd loop
  {/foreach}
{/foreach}
some other stuff';

if ( preg_match ( '#{foreach \$.*?}((?!foreach)|(?R))*{/foreach}#', $str, $matches ) )
{
    print_r($matches);
}
else
{
    echo 'No match';
}
我认为正则表达式就是这样工作的。但显然情况并非如此。所以我的问题是,我的解释哪里错了

您可以在此处使用此代码:


我只是想澄清一下

我试图获取每个
foreach
块的内容。就我而言:

arr[0] => in 1st loop
      {foreach $XYZ}
        in 2nd loop
      {/foreach}
arr[1] => in 2nd loop
或-


两者都可以。

首先,
不匹配任何东西,但每个默认值都匹配换行符。要使其也匹配换行符,必须设置修饰符
s

其次,在这里使用断言:
((?!foreach)|(?R))*
,但没有要匹配的实际字符。在
*
量词前至少需要一个点或其他东西

{foreach\$.*}((?!foreach){124;(?R)).{/foreach}s
在测试文本中给出以下结果:

Array
(
    [0] => {foreach $ABC}
  in 1st loop
  {foreach $XYZ}
    in 2nd loop
  {/foreach}
{/foreach}
    [1] => 
)

我忘了在我的帖子中添加
s
修饰符。但正如你所看到的,它就在代码板页面上。通过在星号前添加一个
,它确实会给出您显示的结果。但是为什么它没有捕获内部的
{foreach$XYZ}
?我希望这个正则表达式能够做到这一点。也不确定空匹配来自哪里,有什么想法吗?没有捕获,因为您没有在子模式周围设置适当的捕获括号。该模式是否编译<代码>{和
}
是regex-land中的特殊字符。@KennethK。是的,看起来不错。当我逃离他们时,我也看不出有什么不同。但也许从现在开始我还是这样做更好。
arr[0] => {foreach $ABC}
      in 1st loop
      {foreach $XYZ}
        in 2nd loop
      {/foreach}
    {/foreach}
arr[1] => {foreach $XYZ}
        in 2nd loop
      {/foreach}
Array
(
    [0] => {foreach $ABC}
  in 1st loop
  {foreach $XYZ}
    in 2nd loop
  {/foreach}
{/foreach}
    [1] => 
)