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

时间:2018-06-12 15:36:21

标签: php laravel laravel-5 php-7 text-parsing

如何按,分割字符串,但跳过数组内的字符串

字符串 - “'==',['abc','xyz'],1”

当我explode(',', $expression)时,它会给我4个数组项目

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

但我希望我的输出是 -

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

3 个答案:

答案 0 :(得分:5)

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

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

https://regexr.com/3qudi

答案 1 :(得分:1)

对于您的示例数据,您可以使用preg_split并使用正则表达式匹配逗号或使用方括号匹配该部分,然后使用(*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

答案 2 :(得分:0)

对于您的示例,如果您不想使用正则表达式并希望坚持使用已经使用的explode()函数,则只需将', '的所有实例替换为{{{} 1}},然后按','(后跟空格)而不是逗号分隔部分字符串。

这使得括号内的东西不具有爆炸分隔符,从而使它们不会分裂成数组。

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

如果括号内的字符串是有效的PHP数组/ JSON字符串

,则此解决方案应该有效
==, test-taco

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

输出是:

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