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