Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式匹配方括号,后跟括号,其中方括号还可以包含其他方括号_Php_Regex_Preg Replace_Preg Match All - Fatal编程技术网

Php 正则表达式匹配方括号,后跟括号,其中方括号还可以包含其他方括号

Php 正则表达式匹配方括号,后跟括号,其中方括号还可以包含其他方括号,php,regex,preg-replace,preg-match-all,Php,Regex,Preg Replace,Preg Match All,我有一些像这样的文本,它是用自定义标记样式格式编写的。例如: [Lorem ipsum] Dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. [Ut wisi] [Enim ad minim veniam](a), quis nostrud exerci tation ulla

我有一些像这样的文本,它是用自定义标记样式格式编写的。例如:

[Lorem ipsum] 
Dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. 

[Ut wisi] 
[Enim ad minim veniam](a), quis nostrud exerci tation ullamcorper. 
suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat. 
Vel illum dolore eu feugiat nulla facilisis at vero.
[Ros et accumsan et iusto odio dignissim](b) qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. 

[[Nam liber]](c)
Tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.
正如您所看到的,标题周围有方括号,括号后面有方括号,括号中包含一个字母,这是我试图与正则表达式匹配的字母。我尝试使用的正则表达式是:

preg_match_all("#\[(.*?)\]\(([a-z]+)\)#is",$html,$matches)
这个^1的问题是它从[Lorem ipsum]一直匹配到(a)的末尾

我也可以使用以下内容,但是我需要能够将标题包含在方括号中,这样它就不能正常工作:

preg_match_all("#\[([^]]+)\]\(([a-z]+)\)#is",$html,$matches)
经过一些阅读,我怀疑我需要的是一个前瞻性的,但我无法得到我的头周围他们。非常感谢您的帮助


澄清

我基本上希望能够用方括号/圆括号组合包装一些文本的任何部分,然后能够将它们与regex匹配,而不必在任何地方使用现有的方括号来引起冲突。示例文本:

[[Lorem ipsum]](a)
Dolor sit amet, [consectetuer adipiscing elit](b), sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. 
所需匹配项:

[[Lorem ipsum]](a)
[consectetuer adipiscing elit](b)
或者。。。更复杂

[[Lorem ipsum]
Dolor sit amet, sed diam nonummy nibh euismod](a) tincidunt ut laoreet dolore magna aliquam erat volutpat. 
所需匹配:

[[Lorem ipsum]
Dolor sit amet, sed diam nonummy nibh euismod](a)

有可能吗?

我想你只需要稍微调整一下你的第一个正则表达式:

preg_match_all("#\[(.*?)\](?:\(([a-z]+)\))?#is",$html,$matches)
                          ^^^            ^^
这样,括号中的字母是可选的

编辑:

经过澄清,这里有一个新的正则表达式:

\[((?:[^][]|\[[^][]*?\])*?\](?:\(([a-z]+)\))?

这是。

我想你只需要稍微调整一下你的第一个正则表达式:

preg_match_all("#\[(.*?)\](?:\(([a-z]+)\))?#is",$html,$matches)
                          ^^^            ^^
这样,括号中的字母是可选的

编辑:

经过澄清,这里有一个新的正则表达式:

\[((?:[^][]|\[[^][]*?\])*?\](?:\(([a-z]+)\))?
给你。

给你

preg_match_all("~
    \[(              # open outer square brackets and capturing group
    (?:              # open subpattern for optional inner square brackets
        [^[\]]*      # non-square-bracket characters
        \[           # open inner square bracket
        [^[\]]*      # non-square-bracket characters
        ]            # close inner square bracket
    )*               # end subpattern and repeat it 0 or more times
    [^[\]]*          # non-square-bracket characters
    )]               # end capturing group and outer square brackets
    (?:              # open subpattern for optional parentheses
        \((          # open parentheses and capturing group
        [a-z]+       # letters
        )\)          # close capturing group and parentheses
    )?               # end subpattern and make it optional
    ~isx",
    $input,
    $matches);
一行中的正则表达式:

"~\[((?:[^[\]]*\[[^[\]]*])*[^[\]]*)](?:\(([a-z]+)\))?~isx"
给你

preg_match_all("~
    \[(              # open outer square brackets and capturing group
    (?:              # open subpattern for optional inner square brackets
        [^[\]]*      # non-square-bracket characters
        \[           # open inner square bracket
        [^[\]]*      # non-square-bracket characters
        ]            # close inner square bracket
    )*               # end subpattern and repeat it 0 or more times
    [^[\]]*          # non-square-bracket characters
    )]               # end capturing group and outer square brackets
    (?:              # open subpattern for optional parentheses
        \((          # open parentheses and capturing group
        [a-z]+       # letters
        )\)          # close capturing group and parentheses
    )?               # end subpattern and make it optional
    ~isx",
    $input,
    $matches);
一行中的正则表达式:

"~\[((?:[^[\]]*\[[^[\]]*])*[^[\]]*)](?:\(([a-z]+)\))?~isx"

m.buettner的回答非常好。它既准确又有很好的记录(它得到了我的支持,值得保留被选中的答案)。我真的很喜欢这样一个事实,即正则表达式是以自由间距模式自我记录的。然而,为了完整性(并作为另一种注释风格的演示),这里有一个等效的(但效率稍高)正则表达式解决方案:

preg\u match\u all('/
#匹配“[…[…]…[…]…](…)”结构。
\[#文字开方括号。
(#$1:方括号内容。
[^[\]*{normal*}零或更多非-[]。
(?:#开始{(特殊常态*)*}。
\[[^[\]*\]{special}嵌套匹配[]对。
[^[\]*.#更多{normal*}零或更多非-[]。
)*#结束{(特殊正态*)*}。
)#$1:方括号内容。
\]#文字闭合方括号。
(?:#可选匹配括号。
\(#文字开括号。
([A-Za-z]+)#$2:括号内容。
\)#文字右括号。
)?#可选匹配括号。
/x',
$input,
元);;
改进(主要是外观/风格):

  • 正则表达式包含在
    “单引号”
    中,而不是
    “双引号”
    中。在PHP中,双引号字符串有额外的解释级别,需要处理更多的字符转义序列(尤其是
    “$”
    字符可能会引起恶作剧)。底线:对于PHP,最好将正则表达式模式括在单引号字符串中(即更少的反斜杠)
  • [嵌套[方括号]结构]
    相匹配的表达式逻辑被重新安排,以实现“展开循环”效率技术。这会减少外方括号没有嵌套方括号时的回溯
  • 捕获组的开括号和闭括号(跨越多行)缩进到同一级别(即垂直对齐),以便于视觉匹配
  • 捕获组编号包含在带有左括号和右括号的行上的注释中
  • s
    单行修改器被删除(无需-没有点!)
  • 删除
    i
    忽略大小写修饰符,并将受影响的字符类
    [a-z]
    更改为
    [a-Za-z]
    ,以进行补偿。(某些正则表达式引擎在区分大小写模式下运行速度稍快。)
  • 文本
    “]”
    结束方括号元字符被显式转义,即:
    “\]”
    。(虽然这不是必需的,但这是IMHO的良好实践)
  • 捕获组
    $2
    合并到一行中
  • 在正则表达式的顶部添加了一个全宽标题注释,描述了正则表达式的总体用途

  • m.buettner的回答非常好。它既准确又有很好的记录(它得到了我的支持,值得保留被选中的答案)。我真的很喜欢这样一个事实,即正则表达式是以自由间距模式自我记录的。然而,为了完整性(并作为另一种注释风格的演示),这里有一个等效的(但效率稍高)正则表达式解决方案:

    preg\u match\u all('/
    #匹配“[…[…]…[…]…](…)”结构。
    \[#文字开方括号。
    (#$1:方括号内容。
    [^[\]*{normal*}零或更多非-[]。
    (?:#开始{(特殊常态*)*}。
    \[[^[\]*\]{special}嵌套匹配[]对。
    [^[\]*.#更多{normal*}零或更多非-[]。
    )*#结束{(特殊正态*)*}。
    )#$1:方括号内容。
    \]#文字闭合方括号。
    (?:#可选匹配括号。
    \(#文字开括号。
    ([A-Za-z]+)#$2:括号内容。
    \)#文字右括号。
    )?#可选匹配括号。
    /x',
    $input,
    $matche