PHP / RegEx - tablo adları prepending için Mantık

3 Cevap php

Yani ("r." ". T", örneğin ya) automagically kendine uygun tablo öneki ile geçerli sütun adlarını slash konulur bir komut dosyası oluşturmak çalışıyorum

$t_columns = array('id', 'name', 'label');
$r_columns = array('related_value');

GİRİŞ:

id > 1 AND (name = 'Hello' OR label IN ('World', 'Planet name AND label')) AND (related_value > 1 AND related_value < 50)

ÇIKIŞ:

t.id > 1 AND (t.name = 'Hello' OR t.label IN ('World', 'Planet name AND label')) AND (r.related_value > 1 AND r.related_value < 50)

Eğer normal bir str_replace yapamam nasıl fark. Ya tüm tablo adları düzgün önüne emin olmak için (I preg_replace tahmin ediyorum) basit kod olurdu?

3 Cevap

Bu şekilde bir çok yapılır ve aynı zamanda düzenli ifade kullanılarak edilebilir. Ben şahsen bir dizi yaklaşım kullanmak istiyorum. Her şeyden önce, ben bozma tablo bu şekilde tanımlamak istiyorum:

$table = array(
    'id' => 't.id',
    'name' => 't.name',
    'label' => 't.label',
    'related_value' => 'r.related_value'
);

Bu çok daha kolay str_replace () çağrı yapacaktır:

function mangling(&$v, $k, $table)
{
    if (($k & 1) == 0)
        $v = str_replace(array_keys($table), array_values($table), $v);
}

$spans = explode("'", ' ' . $input);
array_walk($spans, 'mangling', $table);
$output = implode("'", $spans);

Bir kaç saniyelik düşünme sonra, burada ben bunu çözmek istiyorum nasıl:

Tek tırnak arıyor, ama karakter kaçtı atlayarak, karakter tarafından dize, karakter üzerinden yürüyün. (Dizeleri yani) iki çıkmamış tek tırnak arasındaki şeyler eşsiz bir belirteci ile değiştirilir ve anahtar olarak bu simge ve değer olarak orijinal dize ile ilişkilendirilebilir dizinin içine koymak olacaktır.

Şimdi yolumdan dizeleri var ki, mutlaka bir str_replace() (veya preg_replace(), eğer ısrar) bilinen sütun adları için. Herhalde tuşu, ve sütun adlarını içeren numaralandırılmış bir dizi olarak değer olarak tablonun ad ile, bir ilişkisel diziye sütun adlarını oluşturmak istiyorum. Bu şekilde, değiştirme otomatik olabilir.

Tablo adları doldurulur sonra, sadece geri yerlerine özgün dizeleri yerine, simge için bir str_replace() yapmak, ve bitirdiniz.

Birisi bir vuruşta tüm bunu yapmak için bir süper harika (ve unmaintainable muhtemelen gelecek) regexpi kırbaç olabilir eminim. Ama düzenli ifadeler aslında doğru araçtır, bir CFL daha uygun olacaktır nerede nerede yalnızca durumlarda İfadelerinin kullanmayı tercih.

Düzenli bir ifade burada iyi bir fikir olup olmadığını bilmiyorum. Ben PHP doğrulama kendinizi gerçekleştirmek için yüksek hesaplama karmaşıklığı asgari miktar değer olacağını söyleyebilirim. Sonra, veritabanı herhangi bir değişiklik gerektirmeyen gerektiğini, düzenli ifadenin sağlamlığını artırmak için nasıl endişe saçını çekerek zorunda kalmazsınız.

Jamie Zawinski zamanlar dediği gibi, "Bazı insanlar, bir sorun ile karşılaştıklarında, 'ben normal ifadeler kullanmak olacak, biliyorum.' Düşünüyorum Şimdi iki sorun var. "

Eğer doğru veritabanı üzerinde çalışıyoruz emin olun bir iş akışı oluşturmak açısından, ben bir nesne yönelimli yaklaşım alarak düşünecektim. T ve R tablolar için sınıfları yerine bir regex daha, aynı yöntemi içinde koşullu mantık kullanarak doğru masa tipi nesnesini oluşturmak için sorumlu bir model sınıfı çocukları örneği olabilir.