我正在尝试将以下类似数组的模式与regex匹配:
foo[bar][baz][bim]
我几乎可以使用以下正则表达式:
~([^[]+)(?:\[(.+?)\])*~gm
但是,捕获组仅包括:
Full match: foo[bar][baz][bim]
Group 1: foo
Group 2: bim
我不知道为什么它仅捕获[]
结构的最后一次出现。在这种情况下,我希望它捕获foo,bar,baz和bim。
关于我所缺少的东西有什么想法吗?
答案 0 :(得分:2)
PCRE中重复的捕获组不记得每个先前模式的值。为此,您需要调用\G
令牌:
(?|(\w+)|\G(?!\A)\[([^][]*)\])
正则表达式细目:
(?|
分支重置组的开始
(\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"
}
第一项是“数组”名称,第二项是子项/路径。