2012-06-23 17 views
6

Bir SQL SELECT deyiminden bir alan listesini ayırmak için normal bir ifade arıyorum. PHP Bir SQL alan listesini bölmek için Regex

Zaten sorgunun geri kalanından alan listesini çıkarılan, bu yüzden gibi görünebilir bir dize ile kaldım:
field1,field2,field3,CONCAT(field1,field2) AS concatted,IF(field1 = field2,field3,field4) AS logic 

Ben mantıklı bir yaklaşım üzerinde dize bölmek olacağını düşünüyorum virgül, virgül parantez içinde görünmüyordu, bu yüzden bunu yapmak için doğru düzenli ifadeyi bulmam gerekiyor ...?

Neyi başarmaya çalıştığımın sonucu, hangi alanların doğrudan tablodan seçildiğini ve hangisinin SQL ifadelerinden üretildiğini bulmaktır, böylece daha sonra bunları kullanarak filtrelenip filtrelenmeyeceğine karar verebilirim. WHERE veya HAVING cümleleri.

Alanlar listesi girdikten sonra, mükemmel olmasa da, SQL yazma biçimiyle çalışmam gereken 'AS' anahtar sözcüğünün varlığını kontrol edebilirim.

(ad verilmiş olmayabilir, ya da 'GİBİ' kullanmadan ancak olabilecek ifadeler olmayıp aliased alanlar, ifadeler arasında differenciates başka bir yol öneren Bonus puanlar) Bu regex gerekir

cevap

4

iş: PHP

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

bir örnek uygulama, burada:

$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

görünüyor, teşekkürler! – Codecraft

0

o t geliyor o SQL gibi düzensiz dilleri ayrıştırırken, her zaman düzenli ifadeler yerine uygun bir ayrıştırıcıyla gitmelisiniz.

Sizin durumunuzda bu SQL parser in PHP veya PEAR’s SQL_Parser kullanabilirsiniz. İşi mükemmel yapmak için

İlgili konular