【问题标题】:PHP: Split a string by comma(,) but ignoring anything inside square brackets?PHP:用逗号(,)分割字符串但忽略方括号内的任何内容?
【发布时间】:2018-11-22 01:47:02
【问题描述】:

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

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

当我做 explode(',', $expression) 时,它给了我数组中的 4 项

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

但我希望我的输出是 -

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

【问题讨论】:

  • 您可能正在寻找类似php.net/manual/fr/function.preg-split.php
  • 你是怎么得到这种格式的字符串的?感觉这可能会在流程的早期更容易解决。
  • 在 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 将所有参数转换为字符串。所以现在我必须像这样解析它。
  • @AmitozDeol 如果这是为了解决自定义 Blade 指令仅支持一个参数的限制,我强烈建议将两个参数作为数组、对象或JSON 编码的字符串。试图将一串多个参数分开是解决了错误的问题。

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


【解决方案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】:

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

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

    https://regexr.com/3qudi

    【讨论】:

    • 逗号不能从字符类中受益。 php 中不需要g 模式修饰符。
    【解决方案3】:

    对于您的示例,如果您不想使用正则表达式并希望坚持使用您已经在使用的 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
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 2017-04-07
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 2012-10-30
      相关资源
      最近更新 更多