regexp split string by commas and spaces, but ignore the inside quotes and parentheses

php, regex

Solution

This will work only for non-nested parentheses:

    $regex = <<<HERE
    /  "  ( (?:[^"\\\\]++|\\\\.)*+ ) \"
     | '  ( (?:[^'\\\\]++|\\\\.)*+ ) \'
     | \( ( [^)]*                  ) \)
     | [\s,]+
    /x
    HERE;

    $tags = preg_split($regex, $str, -1,
                         PREG_SPLIT_NO_EMPTY
                       | PREG_SPLIT_DELIM_CAPTURE);

The `++` and `*+` will consume as much as they can and give nothing back for backtracking. This technique is described in perlre(1) as the most efficient way to do this kind of matching.

Problem

I need split string by commas and spaces, but ignore the inside quotes, single quotes and parentheses ``` $str = "Questions, \"Quote\",'single quote','comma,inside' (inside parentheses) space #specialchar"; ``` so that the resultant array will have ``` [0]Questions [1]Quote [2]single quote [3]comma,inside [4]inside parentheses [5]space [6]#specialchar ``` my atual regexp is ``` $tags = preg_split("/[,\s]*[^\w\s]+[\s]*/", $str,0,PREG_SPLIT_NO_EMPTY); ``` but this is ignoring special chars and stil split the commas inside quotes, the resultant array is : ``` [0]Questions [1]Quote [2]single quote [3]comma [4]inside [5]inside parentheses [6]space [7]specialchar ``` ps: this is no csv Many Thanks

Original source