如何在 PHP 中使用正则表达式来匹配这个类似数组的符号?

How can I match this array-like notation using regex in PHP?

我正在尝试将以下类似数组的模式与正则表达式相匹配:

foo[bar][baz][bim]

我几乎可以使用以下正则表达式:

~([^[]+)(?:\[(.+?)\])*~gm

但是,捕获组只包括:

Full match: foo[bar][baz][bim]
Group 1: foo
Group 2: bim

我不明白为什么它只捕获最后一次出现的 [] 结构。在这种情况下,我希望它捕获 foo、bar、baz 和 bim。

关于我遗漏的任何想法?

PCRE 中的重复捕获组不记得每个先前模式的值。为此,您需要调用 \G 令牌:

(?|(\w+)|\G(?!\A)\[([^][]*)\])

live demo here

正则表达式细分:

  • (?| 分支重置组开始
    • (\w+) 抓取单词字符
    • |
    • \G(?!\A)从上一场比赛结束的地方继续
    • \[ 匹配左括号
    • ([^][]*) 捕获除 []
    • 之外的任何内容
    • \] 匹配右括号
  • ) 簇结束

PHP代码:

preg_match_all('~(?|(\w+)|\G(?!\A)\[([^][]*)\])~', 'foo[bar][baz][bim]', $matches);
print_r($matches[1]);

这也可以在没有正则表达式的情况下进行解析。
删除关闭 ] 然后在打开 [.

上爆炸
$str = "foo[bar][baz][bim]";

$str = str_replace("]","",$str);
$arr = explode("[", $str);
var_dump($arr);

Returns:

array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(3) "baz"
  [3]=>
  string(3) "bim"
}

其中第一项是 "array" 姓名,以下是 children/path。