Php 正则表达式在分组符号之间不匹配逗号

Php 正则表达式在分组符号之间不匹配逗号,php,regex,preg-split,Php,Regex,Preg Split,我需要一个正则表达式,它将匹配不在“[”和“]”或“(”和“')”或“{”和“}”之间的逗号。其他分组符号并不重要。我已经试着去弄清楚,但我想不出任何办法来实现这一点 正则表达式将与PHP preg_split函数一起使用,以分割匹配逗号上的字符串 包含逗号和分组符号的示例字符串: <div>Hello<div>,@func[opt1,opt2],{,test},blahblah 你好,@func[opt1,opt2],{,test},blahblah 字符串应按如下

我需要一个正则表达式,它将匹配不在“[”和“]”或“(”和“')”或“{”和“}”之间的逗号。其他分组符号并不重要。我已经试着去弄清楚,但我想不出任何办法来实现这一点

正则表达式将与PHP preg_split函数一起使用,以分割匹配逗号上的字符串

包含逗号和分组符号的示例字符串:

<div>Hello<div>,@func[opt1,opt2],{,test},blahblah
你好,@func[opt1,opt2],{,test},blahblah 字符串应按如下方式拆分:

1: '<div>Hello<div>'
2: '@func[opt1,opt2]'
3: '{,test}'
4: 'blahblah'
1:“你好”
2:“@func[opt1,opt2]”
3:“{,test}”
4:“布拉布拉赫”
我刚刚想到了这一点,但在这一点上,所有分组符号都保证有匹配的符号,以防万一


任何帮助都将非常感激=)

我认为它不能在正则表达式中完成。基本问题是,这需要可变长度的负外观(不允许任何[({后面不跟a])])),而这不是RE当前拥有的功能。

实际上,完成此拆分并非不可能。考虑这个代码:

$str = '<div>Hello<div>,(foo,bar),@func[opt1,opt2],{,test},blahblah';
$arr = preg_split('~([^,]*(?:{[^}]*}|\([^)]*\)|\[[^]]*])[^,]*)+|,~', $str, -1 , PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
var_dump($arr);
$str='Hello,(foo,bar),@func[opt1,opt2],{,test},blahblah';
$arr=preg\u split('~([^,]*(?:{[^]*}}}\([^]*\)\[^]]*])[^,]*)+,~',$str,-1,preg\u split\u DELIM\u CAPTURE | preg\u split\u NO\u EMPTY);
var_转储($arr);
输出:
数组(5){
[0]=>
字符串(15)“你好”
[1]=>
字符串(9)”(foo,bar)
[2]=>
字符串(16)“@func[opt1,opt2]”
[3]=>
字符串(7)“{,test}”
[4]=>
字符串(8)“blahblah”
}

亚历克斯:谢谢,来自这样一个主题专家,这意味着很多。你可能想让捕获组重复,也可能允许其他字符——考虑<代码> 1,[fo]和{bar },3 < /代码>。嗯,事实上,OP和我是一致的,预期的输出是
@func[opt1,opt2]
。另一个我一直没有弄清楚的问题是空代币。如果分析列,则希望保留它们:
1、、.4
。只是想法。@Kobi:谢谢你的评论。我更正了我的答案,使之重复。请检查,它捕获的不是
@func[opt1,opt2]
。另外,由于我使用的是
PREG\u SPLIT\u NO\u EMPTY
标志,因此对于字符串
1,4
,它将输出
1
4
。但是,如果删除此标志,它将正确打印
1
4
。哇。这里有一个非常有趣的解决方案+1哇,这是史诗般的,总是被你的高质量答案所吸引。向上投票:)
array(5) {
  [0]=>
  string(15) "<div>Hello<div>"
  [1]=>
  string(9) "(foo,bar)"
  [2]=>
  string(16) "@func[opt1,opt2]"
  [3]=>
  string(7) "{,test}"
  [4]=>
  string(8) "blahblah"
}