سؤال

لذلك أنا أحاول بناء السيناريو الذي التلقائى prepends صالحة أسماء الأعمدة مع المناسبة بادئة الجدول (مثلا ، "ر" أو "r.")

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

الإدخال:

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

الإخراج:

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)

لاحظ كيف يمكنك أن تفعل العادي str_replace.ما يمكن أن يكون أبسط كود (انا التخمين preg_replace) التأكد من أن جميع أسماء الجداول بشكل صحيح إرفاق مسبقا?

هل كانت مفيدة؟

المحلول

هذا يمكن القيام به في الكثير من الطرق ، وأيضا باستخدام التعابير المنطقية.كنت شخصيا استخدام صفيف النهج.أولا وقبل كل شيء ، أود أن تحديد تغيير اسم الجدول بهذه الطريقة:

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

وهذا سيجعل من الأسهل كثيرا على str_replace() الدعوة:

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);

نصائح أخرى

بعد بضع ثوان من التفكير هنا كيف التصدي لها:

المشي من خلال سلسلة فحم من فحم يبحث عن علامات الاقتباس المفردة, ولكن تخطي أكثر من نجا من الأحرف.الاشياء بين اثنين unescaped علامات الاقتباس المفردة (أيالسلاسل) بعبارة فريدة من نوعها المنطلق وضعت في مجموعة النقابي ، مع أن رمز المفتاح الأصلي سلسلة القيمة.

الآن أن لدينا سلاسل للخروج من الطريق, لا str_replace() (أو preg_replace(), إذا كنت تصر) على المعروف أسماء الأعمدة.ربما بناء على أسماء الأعمدة في مجموعة النقابي ، مع الجدول المستعار مثل قيمة سردي مجموعة تحتوي على أسماء الأعمدة.هذه الطريقة ، واستبدال يمكن أن يكون آليا.

مرة واحدة في الجدول أسماء شغل ، لا مجرد str_replace() بالنسبة الرموز محل النص الأصلي مرة أخرى إلى أماكنهم ، والانتهاء من ذلك.

أنا متأكد من شخص ما قد سوط السوبر رهيبة (و ربما إلى unmaintainable) regexp أن تفعل كل هذا في ضربة واحدة.ولكن أنا أفضل أن استخدام regexps فقط في الحالات التي يكون فيها التعبيرات العادية هي في الواقع الأداة المناسبة ، حيث CFL سيكون أكثر ملاءمة.

أنا لا أعرف إذا كان التعبير العادي هو فكرة جيدة هنا.أود أن أقول أنه سيكون من يستحق الحد الأدنى من زيادة التعقيد الحسابي لأداء التحقق من صحة نفسك في PHP.ثم أن قاعدة البيانات الخاصة بك تتطلب أي تغييرات ، لن تضطر إلى سحب شعرك القلق حول كيفية زيادة متانة التعبير العادي.

كما جيمي كتب أداء قال ذات مرة: "بعض الناس عندما تواجه مشكلة ، أعتقد 'أعرف ، إساءة استخدام التعبيرات العادية.' الآن لديهم اثنين من المشاكل."

من حيث خلق سير العمل التي سوف تأكد من أنك تعمل على قاعدة البيانات أود أن تنظر في اتخاذ كائن المنحى.فصول T و R الجداول يمكن إنشاء مثيل الأطفال من نموذج الطبقة المسؤولة عن بناء الجدول-نوع الكائن باستخدام المنطق الشرطي داخل نفس الأسلوب بدلا من regex.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top