PHP:用逗号(,)分割字符串但忽略方括号内的任何内容?

PHP: Split a string by comma(,) but ignoring anything inside square brackets?

如何按 , 拆分字符串但跳过数组中的字符串

String - "'==', ['abc', 'xyz'], 1"

当我执行 explode(',', $expression) 时,它给了我数组中的 4 个项目

array:4 [
   0 => "'=='"
   1 => "['abc'"
   2 => "'xyz']"
   3 => 1
]

但我希望我的输出是 -

array:3 [
   0 => "'=='"
   1 => "['abc', 'xyz']"
   2 => 1
]

对于示例数据,您可以使用 preg_split and use a regex to match a comma or match the part with the square brackets and then skip that using (*SKIP)(*FAIL)

,|\[[^]]+\](*SKIP)(*FAIL)

$pattern = '/,|\[[^]]+\](*SKIP)(*FAIL)/';
$string = "'==', ['abc', 'xyz'], 1";
$result = preg_split($pattern, $string);
print_r($result);

那会给你:

Array
(
    [0] => '=='
    [1] =>  ['abc', 'xyz']
    [2] =>  1
)

Demo

是的,正则表达式 - select 所有逗号,忽略方括号

/[,]+(?![^\[]*\])/g

https://regexr.com/3qudi

对于您的示例,如果您不想使用正则表达式并想坚持使用您已经在使用的 explode() 函数,您可以简单地将 ', ' 的所有实例替换为 ',',然后用 ,(后跟 space)而不是逗号将字符串分成几部分。

这使得括号内的内容没有爆炸分隔符,从而使它们不会分解成数组。

这还有一个问题,如果你有一个像 '==', 'test-taco' 这样的字符串,这个解决方案将不起作用。这个问题,连同许多其他问题,可以通过从单独的字符串中删除单引号来解决,因为 ==, test-taco 仍然有效。

如果方括号内的字符串有效,此解决方案应该有效 PHP arrays/JSON 字符串

$str = "'==', ['abc', 'xyz'], 1";
$str = str_replace("', '", "','", $str);
$str = explode(", ", $str);

虽然我推荐正则表达式,因为它可以解决一些我没有看到的潜在问题。

输出为:

Array
(
    [0] => '=='
    [1] => ['abc','xyz']
    [2] => 1
)