在圆括号和方括号之间捕获



我有类似这样的文本:

[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 中使用正则表达式实现此目的?

提前感谢,
斯卡约

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

$texts = array_column($matches, 1);

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

我会建议一个基于分支重置功能的正则表达式:

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

查看 PHP 演示

查看正则表达式演示

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

最新更新