PHP: Zeichenkette durch Komma teilen, aber NICHT zwischen geschweiften Klammern oder Anführungszeichen?

In PHP habe ich die folgende Zeichenfolge:

$str = "AAA, BBB, (CCC,DDD), 'EEE', 'FFF,GGG', ('HHH','III'), (('JJJ','KKK'), LLL, (MMM,NNN)) , OOO"; 

Ich muss diese Zeichenfolge in die folgenden Teile aufteilen:

AAA
BBB
(CCC,DDD)
'EEE'
'FFF,GGG'
('HHH','III')
(('JJJ','KKK'),LLL, (MMM,NNN))
OOO

Ich habe mehrere reguläre Ausdrücke ausprobiert, aber keine Lösung gefunden. Irgendwelche Ideen?

AKTUALISIEREN

Ich habe entschieden, dass die Verwendung von Regex nicht die beste Lösung ist, wenn es um fehlerhafte Daten, ausgeblendete Anführungszeichen usw. geht.

Dank der hier gemachten Vorschläge habe ich eine Funktion gefunden, die Parsing verwendet und die ich entsprechend meinen Anforderungen neu geschrieben habe. Es kann mit verschiedenen Arten von Klammern umgehen, und das Trennzeichen und das Anführungszeichen sind ebenfalls Parameter.

 function explode_brackets($str, $separator=",", $leftbracket="(", $rightbracket=")", $quote="'", $ignore_escaped_quotes=true ) {

    $buffer = '';
    $stack = array();
    $depth = 0;
    $betweenquotes = false;
    $len = strlen($str);
    for ($i=0; $i<$len; $i++) {
      $previouschar = $char;
      $char = $str[$i];
      switch ($char) {
        case $separator:
          if (!$betweenquotes) {
            if (!$depth) {
              if ($buffer !== '') {
                $stack[] = $buffer;
                $buffer = '';
              }
              continue 2;
            }
          }
          break;
        case $quote:
          if ($ignore_escaped_quotes) {
            if ($previouschar!="\\") {
              $betweenquotes = !$betweenquotes;
            }
          } else {
            $betweenquotes = !$betweenquotes;
          }
          break;
        case $leftbracket:
          if (!$betweenquotes) {
            $depth++;
          }
          break;
        case $rightbracket:
          if (!$betweenquotes) {
            if ($depth) {
              $depth--;
            } else {
              $stack[] = $buffer.$char;
              $buffer = '';
              continue 2;
            }
          }
          break;
        }
        $buffer .= $char;
    }
    if ($buffer !== '') {
      $stack[] = $buffer;
    }

    return $stack;
  }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage