如何在 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)\[([^][]*)\])
正则表达式细分:
(?|
分支重置组开始
(\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。
我正在尝试将以下类似数组的模式与正则表达式相匹配:
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)\[([^][]*)\])
正则表达式细分:
(?|
分支重置组开始(\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。