使用正则表达式PHP的递归标记匹配

时间:2012-06-06 18:25:35

标签: php regex recursion tags

我正在使用“特殊”标签,但我遇到了递归问题。有一个例子:

<!-- BEGIN foo --> parent text <!-- BEGIN bar --> child text <!-- END --> aditional parent text<!-- END --> <!-- BEGIN foobar --> third text <!-- END -->

当我使用[^BEGIN]时,它工作得很好,直到我没有在标签内输入B。与[^<!\-\-]相同。我正在玩(?!BEGIN)(?<!BEGIN)而没有成功。

我的最后一次尝试看起来像这样(但它不起作用):

#<!--\s?BEGIN\s?(.+?)\s?-->((?!BEGIN).|(?R))*<!--\s?END\s?-->#s

感谢您的回答,
汤姆

1 个答案:

答案 0 :(得分:0)

试试这个:

#<!-- BEGIN [a-z]+ -->([a-z ]*(?R)?[a-z ]*)<!-- END -->#

实际上,不要试试;正如评论中提到的,解析器应该是递归解析的首选。但是this does work

请注意:

  • 我对你的输入做了一些假设(比如假设'foo'和'bar'将始终是字母数字,并且空格是非可选的。)你可以很容易地改变它们。
  • 它只会捕获匹配标记的最底层。一旦你有了这些,如果你想找到任何嵌套匹配,你需要再次运行它。递归仅用于将begin与其适当的结尾进行匹配。