正则表达式匹配@ {...}构造内的内容与括号平衡

时间:2015-08-23 11:30:54

标签: php regex

我想创建一个在@{ some text }之间捕获文本的正则表达式。我知道如何为简单字符串执行此操作,但在这种情况下,@{ }之间的文本可能包含起始和结束花括号,这些大括号会与@{ {{中的大括号混淆1}}。

示例:

输入字符串:

}

结果(3场比赛)应为:

第一场比赛:

This is some text that does not match the regex

@{

    This is some text

    {
        This another text

        {
            inner text
        }
    }

}

@{
    this is text2
}

another text that does not match the regex


@{
    this is another text
    {
        another inner text
    }
}

第二场比赛:

This is some text

{
    This another text

    {
        inner text
    }
}

第三场比赛:

this is text2

有谁能告诉我如何实现这个目标?我顺便使用PHP。

1 个答案:

答案 0 :(得分:2)

可能需要recursive regex来解决嵌套大括号:

if(preg_match_all('/@(?={)([^}{]+|{((?1)*)})/', $str, $out)!==false)
  print_r($out[2]);
  • @(?={)@ if followed by开头大括号
  • 开始
  • [^}{]匹配任何字符that is not大括号
  • 从第一个带括号的子模式
  • 粘贴(?1)
  • ((?1)*)将想要的内容捕获到第二组

如果感兴趣,请参阅test at regex101test at eval.inSO regex FAQ:]