【问题标题】:Explode string when not between ()不在 () 之间时爆炸字符串
【发布时间】:2015-09-11 13:45:03
【问题描述】:

我正在尝试用逗号explode 一个字符串:,,但前提是它不在括号 (...) 之间

这里有一些代码来说明我的意思:

$string = "K.VisueelNr,IFNULL(P.Partijnaam, 'Leeg gemeld') AS Partijnaam,R.Ras,M.Maat,DATE_FORMAT(KS.Timestamp, '%d-%c-%Y') AS Datum,H.Handelshuis,KS.Actie";

print_r(str_getcsv($string, '()'));

print_r(explode(",", $string));

将输出:

Array
(
    [0] => K.VisueelNr,IFNULL
    [1] => P.Partijnaam, 'Leeg gemeld') AS Partijnaam,R.Ras,M.Maat,DATE_FORMAT
    [2] => KS.Timestamp, '%d-%c-%Y') AS Datum,H.Handelshuis,KS.Actie
)
Array
(
    [0] => K.VisueelNr
    [1] => IFNULL(P.Partijnaam
    [2] =>  'Leeg gemeld') AS Partijnaam
    [3] => R.Ras
    [4] => M.Maat
    [5] => DATE_FORMAT(KS.Timestamp
    [6] =>  '%d-%c-%Y') AS Datum
    [7] => H.Handelshuis
    [8] => KS.Actie
)

但我正在寻找这样的输出:

Array
(
    [0] => K.VisueelNr
    [1] => IFNULL(P.Partijnaam, 'Leeg gemeld') AS Partijnaam
    [2] => R.Ras
    [3] => M.Maat
    [4] => DATE_FORMAT(KS.Timestamp, '%d-%c-%Y') AS Datum
    [5] => H.Handelshuis
    [6] => KS.Actie
)

Here's an PHP Sandbox fiddle to play around

也许它必须用preg_split 完成,但我不知道regex 会是什么样子......

【问题讨论】:

    标签: php regex explode delimiter


    【解决方案1】:

    需要一个适用于嵌套括号的解决方案并提出了这个:

    $delimiter = ',';
    $string = "K.VisueelNr,IFNULL(P.Partijnaam, 'Leeg gemeld') AS Partijnaam,func(arg1, func(arg2)) as field";
    
    $array = explode($delimiter, $string);
    $new_array = [];
    $helper_string = '';
    $count1 = 0;
    $count2 = 0;
    foreach ($array as $str) {
        $count1 += substr_count($str, '(');
        $count2 += substr_count($str, ')');
        if (strlen($helper_string) > 0) {
            $helper_string .= $delimiter;
        }
        $helper_string .= $str;
        if ($count1 === $count2) {
            $new_array[] = $helper_string;
            $helper_string = '';
            $count1 = 0;
            $count2 = 0;
        }
    }
    // Fallback in case of broken brackets
    if (strlen($helper_string)) {
        $new_array[] = $helper_string;
    }
    print_r($new_array);
    

    结果:

    Array
    (
        [0] => K.VisueelNr
        [1] => IFNULL(P.Partijnaam, 'Leeg gemeld') AS Partijnaam
        [2] => func(arg1, func(arg2)) as field
    )
    

    【讨论】:

      【解决方案2】:

      您需要使用preg_split,它根据给定的正则表达式拆分输入。

      $words = preg_split('~,(?![^()]*\))~', $str);
      print_r($words);
      

      DEMO

      解释:

      • , 匹配所有逗号,但前提是不匹配
      • 后跟任何字符,但不是(),零次或多次
      • 后跟一个右括号。

      如果将(?! 更改为(?=,则与匹配括号内的所有逗号相反。

      【讨论】:

      • 非常感谢。它的工作确实符合预期。也非常感谢您提供演示链接。解释提供的信息很有帮助
      • @Mathlight 请注意,此方法非常脆弱。当有嵌套的函数调用时,它会中断。
      • @nhahtdh 幸运的是,情况并非如此。但现在我很好奇。你能指出我对这个问题的解释吗?
      • @Mathlight:这是一个例子func(arg1, func(arg2)) as field。当您只查看, 前面的某些字符时,您通常不能期望它正常工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多