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


recursive tag match using regular expression PHP

我正在使用"特殊"标签,但我在递归方面有问题。举个例子:

<!-- 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

感谢您的回答,
汤姆

试试这个:

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

实际上,不要尝试这样做;正如评论中提到的,解析器确实应该优先用于递归解析。但这确实有效。

请注意:

  • 我对你的输入做了一些假设(比如假设"foo"和"bar"将始终是字母数字,并且空格是非可选的。您可以轻松地将它们更改回来。
  • 它只会捕获最底层的匹配标签。拥有这些后,如果您希望找到任何嵌套匹配项,则需要再次运行它。递归性仅用于匹配开头与其适当的结尾。