Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中使用正则表达式匹配这种类似数组的表示法?_Php_Regex_Pcre - Fatal编程技术网

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

如何在PHP中使用正则表达式匹配这种类似数组的表示法?,php,regex,pcre,Php,Regex,Pcre,我正在尝试将以下类似数组的模式与正则表达式匹配: foo[bar][baz][bim] 我几乎用下面的正则表达式实现了它: ~([^[]+)(?:\[(.+)\])*~gm 但是,捕获组仅包括: Full match: foo[bar][baz][bim] Group 1: foo Group 2: bim 我不明白为什么它只捕获最后一次出现的[]结构。我希望它在这种情况下捕获foo、bar、baz和bim 关于我遗漏的内容有什么想法吗?在PCRE中重复捕获组不记得以前每个模式的值。为此,您需

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

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)
      Conitnue从上一个匹配结束的位置开始
    • \[
      匹配开口括号
    • ([^][]*)
      捕获除
      [
      ]
    • \]
      匹配右括号
  • 群集结束
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);
返回:

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

其中第一项是“数组”名字和下面是孩子/路径。

很好。我不能接受,因为我的问题是关于正则表达式的,但我也要尝试一下,谢谢。@TimothyFisher我真的觉得Revo是值得接受的,因为他钉了正则表达式,但你可以选择你接受的答案。这与你最初问的问题无关。想想我吧就好像有人问如何在文本文件中存储纯文本用户名和密码一样。显然,如何读/写文本文件的答案是正确的,但事实并非如此。