我目前正试图在PHP中编写一个正则表达式,该正则表达式允许我匹配包含自身的特定模式的完全嵌套。我知道每个默认的正则表达式都无法做到这一点,但PHP的递归模式(http://php.net/manual/de/regexp.reference.recursive.php)应该可以。使用正则表达式(使用PHP的递归)匹配嵌套模式
我有嵌套的结构是这样的:
<a=5>
<a=3>
Foo
<b>Bar</b>
</a>
Baz
</a>
现在我想最外层标签的内容相匹配。为了正确匹配第一个开始标签和最后一个结束标签,我需要PHP的递归项(?R)
。
我试图像这样的图案:
/<a=5>((?R)|[^<]|<\/?[^a]|<\/?a[a-zA-Z0-9-])*<\/a>/s
这基本上意味着<a=5>
,随后尽可能多的下面,接着</a>
:
- 另一个标签(递归的)
- 任何非开始标记字符
- 任何开始标记,后跟一个可选斜线,后面跟着一个“a”
- 在之前的一个,但没有完成(后面至少1个字元)
最后2情况都只是一个案例[标签不namend“一”],但我听说这应该在正则表达式中应避免使用,因为它需要lookarounds并且性能不好。
但是,我在RegEx中看到没有错误,但它与给定的字符串不匹配。我想下面的比赛:
<a=3>
Foo
<b>Bar</b>
</a>
Baz
下面就玩的正则表达式的链接:https://www.regex101.com/r/lO1wA6/1
如果你真的只为开'<'标志,那么它可能确实是足够了。关于'(?R)'的一个注意:它不会缓解第一组,而是整个模式。使用'R1'。但是,仍然可以尝试使用'/ x'来实现可读性和内联注释,并且还提供了匹配成功的更基本示例。 – mario 2014-12-19 01:56:00
谢谢,我刚刚意识到我的错误。我希望外部标签匹配'a = 5',但内部匹配'a。*?'。 – Felk 2014-12-19 02:00:15
这看起来像xml/html。你应该使用xml/html解析器来做到这一点。 – pguardiario 2014-12-19 02:33:51