Php regex通过忽略内部标记来匹配结束标记

Php regex通过忽略内部标记来匹配结束标记,php,regex,preg-match,Php,Regex,Preg Match,我想捕获MediaWiki格式的图像标签,例如 [[图片:贾斯特斯·萨斯特曼-伽利略·伽利略的肖像 (Uffizi).jpg | left | thumb | right |[[Galileo]]通常被称为 [[现代天文学]]之父,[[贾斯特斯]的肖像 苏斯特曼人]]] 我必须忽略内部的[[…]]以匹配整体(以粗体[[[/code>和]]显示)。我想出了 \[\[Image:((?:[^]]*+(?:(?!\[\[)|(?R))*+)*+)\]\] 但它在第一个]处停止 您可以使用 \[\[图

我想捕获MediaWiki格式的图像标签,例如

[[图片:贾斯特斯·萨斯特曼-伽利略·伽利略的肖像 (Uffizi).jpg | left | thumb | right |[[Galileo]]通常被称为 [[现代天文学]]之父,[[贾斯特斯]的肖像 苏斯特曼人]]]

我必须忽略内部的
[[…]]
以匹配整体(以粗体
[[[/code>和
]]
显示)。我想出了

\[\[Image:((?:[^]]*+(?:(?!\[\[)|(?R))*+)*+)\]\]
但它在第一个
]
处停止

您可以使用

\[\[图像:(((?:[^][++\124;)(\[\[(?:[^][++\ 124;(?-1))*]]))*)]]

详情:

  • \[\[Image:
    -文本
    [[Image:
    字符串
  • ((?:[^][]+|)(\[\[(?:[^][]++|(?-1))*]))*))*)
    -第一组:
    • (?:[^][]|(\[\[(?:[^][]+++(?-1))*]))*
      -零次或多次出现
      • [^][]+
        -除
        [
        ]
        以外的任何一个或多个字符
      • |
        -或
      • (\[\[(?:[^][+++[124;(?-1))*])
        -第2组(技术,用于递归):嵌套的
        [[
        ]
        之间的子字符串
  • ]
    -一个
    ]
    字符串
注意:如果确定只有一个嵌套级别的双方括号,则可以使用

\[\[图像:([^][]*(?:\[\[^][]*]][^][]*)*)]]
看。在这里,
([^][]*(?:\[\[^][]*][^][]]*][^]][]*])
将除
[
]
之外的任何零个或多个字符捕获到组1中,然后在双方括号之间匹配零个或多个出现的子字符串(内部没有方括号),然后匹配除
[
]之外的零个或多个字符

您可以使用

\[\[图像:(((?:[^][++\124;)(\[\[(?:[^][++\ 124;(?-1))*]]))*)]]

详情:

  • \[\[Image:
    -文本
    [[Image:
    字符串
  • ((?:[^][]+|)(\[\[(?:[^][]++|(?-1))*]))*))*)
    -第一组:
    • (?:[^][]|(\[\[(?:[^][]+++(?-1))*]))*
      -零次或多次出现
      • [^][]+
        -除
        [
        ]
        以外的任何一个或多个字符
      • |
        -或
      • (\[\[(?:[^][+++[124;(?-1))*])
        -第2组(技术,用于递归):嵌套的
        [[
        ]
        之间的子字符串
  • ]
    -一个
    ]
    字符串
注意:如果确定只有一个嵌套级别的双方括号,则可以使用

\[\[图像:([^][]*(?:\[\[^][]*]][^][]*)*)]]

看。在这里,
([^][]*(?:\[\[^][]*][^][]]*][^]][]*])
将除
[
]
之外的任何零个或多个字符捕获到组1中,然后在双方括号之间匹配零个或多个出现的子字符串(内部没有方括号),然后匹配除
[
]之外的零个或多个字符

或者您可以查找平衡方括号,但使用查找框限制两端的规则:

(?=\[\[Image:)(\[(?:[^][]|(?1))*])(?<=]])

请参见

,或者您可以查找平衡方括号,但使用查找框限制两端的规则:

(?=\[\[Image:)(\[(?:[^][]|(?1))*])(?<=]])

查看与上面引用的全部文本相匹配的

@anubhava(维基文本之外)。因此,您不需要实际捕获
[[Image:
]
之间的文本?那么为什么要使用捕获组?@anubhava匹配上面引用的全部文本(wiki文本之外)。因此,您不需要实际捕获
[[Image:
]]
之间的文本?那你为什么要用一个抓捕小组?