【问题标题】:Capture between round brackets and square brackets在圆括号和方括号之间捕获
【发布时间】:2017-07-09 12:40:23
【问题描述】:

我有一个类似这样的文字:

[text]
(more text)
(text...)
[text!]
(last text)

我需要匹配 () 和 [] 之间的文本。
输出应该是这样的:

[
  "text",
  "more text",
  "text...",
  "text!",
  "last text"
]

我已经尝试过/[\[\(](.*?)[\]\)]/,但它在 PHP 中不起作用。
如果需要,这里是代码:

 preg_match_all('/[\[\(](.*?)[\]\)]/', $text, $matches, PREG_SET_ORDER, 0);
 var_dump($matches);

如何在 PHP 中使用正则表达式来实现这一点?

提前致谢,
斯卡约

【问题讨论】:

  • 但是这个正则表达式也会匹配[abcd)
  • 是的,我知道。但在这种情况下,它还不错。
  • 如果括号外没有任何文字:[^][)(]+

标签: php regex


【解决方案1】:

实际上,该代码就像一个魅力。你只需要添加一行来过滤掉匹配的部分:

$texts = array_column($matches, 1);

有关工作示例,请参阅 https://3v4l.org/uCHIB

【讨论】:

  • 你说得对,它有效...我遇到了另一个与正则表达式无关的问题。还是谢谢!!
【解决方案2】:

我会建议基于branch reset 功能的正则表达式:

$re = '/(?|\[([^]]*)]|\(([^)]*)\))/';
$str = '[text]
(more text)
(text...)
[text!]
(last text)';

preg_match_all($re, $str, $matches);

PHP demo

regex demo

  • (?| - 分支重置开始
  • \[ - 一个[
  • ([^]]*) - 除] 之外的任何 0+ 个字符
  • ] - 文字 ]
  • | - 或
  • \( - 文字 (
  • ([^)]*) - 除) 之外的任何 0+ 个字符
  • \) - 文字 )
  • ) - 分支重置组结束。

【讨论】: