Search code examples
phpregexexplodedelimiter

Explode string when not between ()


I'm trying to explode an string by comma's: , but only when it's not between parenthesis (...)

Here's some code to show what I mean:

$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));

Which will output:

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
)

But I'm looking for an output like this:

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

Maybe it has to be done with preg_split, but I don't know how the regex would look like then...


Solution

  • You need to use preg_split which splits the input according to the given regex.

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

    DEMO

    Explanation:

    • , matches all the commas, only if it's not
    • followed by any char but not of ( or ), zero or more times
    • and further followed by a closing bracket.

    If you change (?! to (?=, it does the opposite of matching all the commas which are present inside the brackets.