我有类似这样的文本:
[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+ 字符)
- 文字)
)
- 分支重置组的结束。