PHP/RegEx - Логика для добавления имен таблиц

StackOverflow https://stackoverflow.com/questions/453975

  •  19-08-2019
  •  | 
  •  

Вопрос

Итак, я пытаюсь создать скрипт, который автоматически добавляет допустимые имена столбцов к соответствующему табличному префиксу (например"т". или "р".)

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top