preg_replace, сохранение результатов, обратная замена

Invizz

Новичок
preg_replace, сохранение результатов, обратная замена

Eсть система. Возникла необходимость изменить ее до определеннного порядка. Для этого, нужно сделать несколько preg_replace'ов для запросов. И не обсуждается по многим причинам, могу даже сказать по каким.

Эти реплейсы выглядят примерно так:

PHP:
$query=preg_replace(   '@SELECT\s{1,}(DISTINCT){0,1}\s{1,}(.*?)FROM\s{1,}(\S+)(.*?)JOIN(.*?)WHERE(.*?)\s(LIMIT|ORDER|GROUP)@s',
'SELECT \1 \2 FROM \3 \4 JOIN  \5 WHERE \3.blog_id='.$this->blog_id.' AND ( \6 ) \7',   
$query);
Как видите, он ищет по слова WHERE JOIN FROM итд.

Если в названии колонки или таблицы (к примеру), встретится слово where, например запрос будет иметь вид

select * from table left join table_where where

то он "схавает" where тот который неслужебный. а так не надо.

Тут можно сказать, так сделай типа, поиск с пробелами и чувствительным к регистру! А нет, а допустим если запрос:

INSERT INTO posts(id,content) VALUES('','А я тут сегодня начился пользоваться \) скобками, \' кавычками VALUE WHERE INTO ');

и в переменном тексте могут содержаться ненужные слова.

Поэтому было принято решение сначала все в
озможные переменные данные "экстрактнуть" из запроса, сделать изменения и данные воткнуть обратно.

Возьмем к примеру, простенький,

SELECT link_id,link_order,link_category from `links` order by link_id

Нужно все имена колонок выдрать так, чтобы осталось:

SELECT var1,var2,var3 FROM `links` order by var1

Потом выполняются действия над запросами.

А потом var1,var2,var3 заменяются на link_id,link_order,link_category обратно.


Как заменить-то, я понимаю, а вот как сохранить результаты и заменить обратно?

Извините, что так длинно получилось, и может путанно, но вот как то так.
 

white phoenix

Новичок
> Если в названии колонки или таблицы (к примеру), встретится слово where, например запрос будет иметь вид
Кури мануал по регулярным выражениям.
> Как заменить-то, я понимаю, а вот как сохранить результаты и заменить обратно?
Не понял. Что значит заменить обратно? Про переменные слышал?
_RVK_
Я тоже не понял.
 

Invizz

Новичок
white phoenix
Пля, да курил я мануал. И в данном случае WHERE не заменится, я пытался показать логику.

Про переменные слышал, чай не первый раз кодю.

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

Судя по возможностям функций мне поможет только callback.
 

Invizz

Новичок
Спасибо, я думаю я достаточно хорошо объяснил. Проще разобраться самому.

-~{}~ 15.01.06 07:08:

PHP:
echo preg_replace_callback('@((?<!\\\\)"(.*?)(?<!\\\\)")|((?<!\\\\)\'(.*?)(?<!\\\\)\')@',create_function('$matches','
global $counter,$extracted_data;
$now=$counter++;  
$extracted_data["EXTRACTED_DATA_".$now]=$matches[0]; 
return "EXTRACTED_DATA_".$now;'),$query);
						
						
print_r($extracted_data);
Сделал сам. Боюсь, что только памяти много жраться будет созданными функциями.
 

white phoenix

Новичок
Invizz
> Боюсь, что только памяти много жраться будет созданными функциями.
Функция в данном случае создается один раз.
 

Invizz

Новичок
это все дело внутри класса и этот реплейс вызывается каждый раз при выполнении запроса. Проверил - уменьшение скорости почти в 3 раза :D я решил сделать немного по другому в итоге.
 
Сверху