PHP / RegEx - логика для добавления имен таблиц - PullRequest
0 голосов
/ 17 января 2009

Поэтому я пытаюсь создать сценарий, который автоматически добавляет действительные имена столбцов с соответствующим префиксом таблицы (например, «t.» Или «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 ), чтобы обеспечить правильное добавление всех имен таблиц?

Ответы [ 3 ]

1 голос
/ 17 января 2009

Подумав несколько секунд, я бы решил:

Пройдите через строку, символ за символом, ищите одинарные кавычки, но пропуская экранированные символы. Содержимое между двумя неэкранированными одинарными кавычками (т.е. строками) будет заменено уникальным токеном и помещено в ассоциативный массив с этим токеном в качестве ключа и исходной строкой в ​​качестве значения.

Теперь, когда у нас нет строк, выполните str_replace() (или preg_replace(), если вы настаиваете) для известных имен столбцов. Я бы, вероятно, построил имена столбцов в ассоциативный массив с псевдонимом таблицы в качестве ключа и значением в виде перечислимого массива, содержащего имена столбцов. Таким образом, замена может быть автоматизирована.

Как только имена таблиц заполнены, просто наберите str_replace() для токенов, чтобы заменить исходные строки на свои места, и все готово.

Я уверен, что кто-то может использовать супер-удивительное (и, вероятно, рядом с не поддерживаемым) регулярное выражение, чтобы сделать все это одним ударом. Но я предпочитаю использовать регулярные выражения только в ситуациях, когда регулярные выражения на самом деле являются правильным инструментом, а не там, где CFL был бы более подходящим.

0 голосов
/ 09 октября 2009

Это можно сделать разными способами, а также с помощью регулярных выражений. Я бы лично использовал подход массива. Прежде всего, я бы определил таблицу искажения следующим образом:

$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);
0 голосов
/ 17 января 2009

Я не знаю, является ли регулярное выражение хорошей идеей здесь. Я бы сказал, что стоило бы минимального увеличения вычислительной сложности самостоятельно выполнить валидацию в PHP. Затем, если ваша база данных потребует каких-либо изменений, вам не придется выдергивать волосы, беспокоясь о том, как повысить устойчивость вашего регулярного выражения.

Как однажды сказал Джейми Завински: «Некоторые люди, сталкиваясь с проблемой, думают:« Я знаю, я буду использовать регулярные выражения ». Теперь у них две проблемы. "

С точки зрения создания рабочего процесса, который будет гарантировать, что вы работаете с правильной базой данных, я бы рассмотрел использование объектно-ориентированного подхода. Классы для таблиц T и R могут быть созданы потомками класса модели, ответственного за построение правильного объекта табличного типа с использованием условной логики в том же методе, а не в регулярном выражении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...