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

时间:2019-01-05 21:44:13

标签: php regex pcre

我正在尝试将以下类似数组的模式与regex匹配:

foo[bar][baz][bim]

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

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

但是,捕获组仅包括:

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

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

关于我所缺少的东西有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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]);

答案 1 :(得分:1)

这也可以不用正则表达式进行解析。
删除结尾的],然后在开头的[上爆炸。

$str = "foo[bar][baz][bim]";

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

返回:

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

第一项是“数组”名称,第二项是子项/路径。