2012-06-23 10 views
6

Ich bin auf der Suche nach einem regulären Ausdruck spalten eine Feldliste aus einer SQL-SELECT-Anweisung zu teilen.PHP Regex eine SQL-Feldliste

Ich habe extrahiert bereits die Feldliste aus dem Rest der Abfrage, so dass ich mit einem String-links, die wie folgt aussehen kann:

field1,field2,field3,CONCAT(field1,field2) AS concatted,IF(field1 = field2,field3,field4) AS logic 

ich die logische Ansatz die Zeichenfolge wäre denken an eine aufzuspalten Komma, vorausgesetzt, das Komma erscheint nicht in Klammern, so brauche ich nur den richtigen regulären Ausdruck zu finden, das zu tun ...?

Das Endergebnis von dem, was ich versuche zu erreichen, ist herauszufinden, welche Felder gerade aus der Tabelle ausgewählt werden, und welche aus SQL-Ausdrücken gemacht werden, so dass ich später entscheiden kann, ob sie mit Filtern WHERE oder HAVING-Klauseln.

Sobald ich die Liste der Felder habe, kann ich nach dem Vorhandensein des Schlüsselwortes 'AS' suchen, das, obwohl es nicht perfekt ist, mit der Art arbeiten sollte, wie ich SQL schreibe.

(Bonuspunkte einen anderen Weg für die Annahme, dass zwischen den Feldern differenciates, die nicht Ausdrücke sind aber Aliasing, und Ausdrücke, die nicht aliased sein kann oder sein kann ‚AS‘, ohne aber)

Antwort

4

Diese Regex sollte Arbeit:

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

Eine beispielhafte Implementierung in PHP, hier:

$vv = 'field1,field2,field3,CONCAT(field1,field2) AS concatted,IF(field1 = field2,field3,field4) AS logic'; 

$arr = preg_split ("/,(?![^()]*+\\))/", $vv); 
foreach ($arr as &$value) { 
    print($value); 
} 
+0

erscheint den Job perfekt, dank zu tun! – Codecraft

0

Wenn es darum geht t o Parsen unregelmäßigen Sprachen wie SQL, sollten Sie immer mit einem geeigneten Parser gehen, anstatt einige reguläre Ausdrücke.

In Ihrem Fall könnten Sie diese SQL parser in PHP oder PEAR’s SQL_Parser verwenden.