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

3

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

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

当我执行explode(',', $expression)时,它会在数组中给出4项。

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

但我希望我的输出是 -
array:3 [
   0 => "'=='"
   1 => "['abc', 'xyz']"
   2 => 1
]

1
你可能正在寻找类似于这个的东西:http://php.net/manual/fr/function.preg-split.php - Gregoire Ducharme
1
你是怎么得到这种格式的字符串的?感觉在处理过程中更早地解决可能会更容易。 - iainn
在laravel 5.6中,当我创建自定义Blade指令Blade :: directive('role',function($ symbol,$ check_roles){ .....} 时,我收到此错误消息 错误:Type error: Too few arguments to function App\Providers\RoleServiceProvider::App\Providers\{closure}(), 1 passed and exactly 2 expected 在我的视图中:@role('==', ['Manager', 'User'])。结果,laravel将所有参数转换为字符串。所以现在我必须这样解析。 - Amitoz Deol
3
如果这是为了解决自定义 Blade 指令只支持一个参数的限制,我 强烈建议 将两个参数作为数组、对象或 JSON 编码的字符串传递。试图分离包含多个参数的字符串是解决错误问题。 - iainn
3个回答

6

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

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

https://regexr.com/3qudi


逗号在字符类内部没有任何好处。在 PHP 中不需要使用 g 模式修饰符。 - mickmackusa

1
对于您的示例数据,您可以使用preg_split并使用regex来匹配逗号或匹配带方括号的部分,然后使用(*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
)

演示


0

对于您的示例,如果您不想使用正则表达式并希望坚持使用您已经使用的explode()函数,您可以简单地将所有实例', '替换为',',然后通过,(后跟一个空格)而不仅仅是逗号来分解字符串。

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

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

如果您括号内的字符串是有效的PHP数组/JSON字符串,则此解决方案应该可以工作。

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

虽然我建议使用正则表达式,因为它可能解决一些我没有看到的潜在问题。

输出是:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接