Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » preg_replace задачка
Извлечение данных и их обратная вставка

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Invizz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вообщем, есть запросы к mysql. Разной сложности.
 
Возьмем к примеру, простенький,  
 
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 обратно.
 
Как заменить - я понимаю. А как сохранить результаты и потом сделать обратную замену - нет.
 
Добавлено:
придется через колбек делать.

Всего записей: 135 | Зарегистр. 10-04-2005 | Отправлено: 11:15 14-01-2006
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Потом выполяются разные действия над этим запросом (другие замены всякие).  
А потом  var1,var2,var3 заменяются на link_id,link_order,link_category обратно.  
 
Как заменить - я понимаю. А как сохранить результаты и потом сделать обратную замену - нет.

ничего не понял, если честно..
структуру таблицы можно узнать..
возвращаемые столбцы - не обязательно же работать с ассоциированными массивами, можно и с пронумерованными, а там имена столбцов побоку.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:35 15-01-2006
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Скорее тут не структуру надо спрашивать, а требовать нормального описания задачи, где и зачем подобный изврат требуется. Поскольку сдаётся мне, метод решения исходной проблемы выбран не лучшим образом.

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 01:16 15-01-2006
Invizz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ладно, перефразирую:
Есть система. Возникла необходимость изменить ее до определеннного порядка. Для этого, нужно сделать несколько preg_replace'ов для запросов. ДРУГИХ ВАРИАНТОВ РЕШЕНИЯ НЕ ДАНО. И не обсуждается по многим причинам, могу даже сказать по каким.
 
Эти реплейсы выглядят примерно так:
 
$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 ');
 
и в переменном тексте могут содержаться ненужные слова.
 
Поэтому было принято решение сначала все в
озможные переменные данные "экстрактнуть" из запроса, сделать изменения и данные воткнуть обратно.
 
Лучше объяснил?

Всего записей: 135 | Зарегистр. 10-04-2005 | Отправлено: 03:01 15-01-2006
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
ДРУГИХ ВАРИАНТОВ РЕШЕНИЯ НЕ ДАНО
Звучит неубедительно.

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 03:15 15-01-2006
Invizz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SiMM
Блин, симм, прошу тебя, я уважаю твой опыт, но не надо разводить балаган, а?
Хорошо, почему не дано:
 
Эта система переписывается второй раз. Первый раз она была переписана одними людьми, что вылилось в одну из веток развития этой системы - был переписан весь код. Каждый запрос был переписан вручную. В итоге когда основная часть (не переписанная) обновлялась, и обновлалась она довольно часто и внушительно, переписанную пытались обновлять тоже. Что из этого вышло - 10 багов на 1 фикс в каждой версии.
 
Потом было принято решение переписать всю с нуля: Ничего не трогается, изменяется только класс работы с базой данных. И это получилось отлично. Сейчас все работает, пока в контенте не встретится одно из служебных слов. Поэтому и задаю вопрос.

Всего записей: 135 | Зарегистр. 10-04-2005 | Отправлено: 03:27 15-01-2006
SiMM

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Регулярные выражения там не нужны. Или, по крайней мере, необязательны. Просто задачу надо рассматривать по-другому - нужно выделить области, где нужно делать замену, и где нельзя. Как решить обратную задачу (выделить содержимое скобок) я покажу, прямую задачу - решай сам (должен же ты хоть что-то сделать сам).
Код:
// в $q содержится SQL-запрос
$f = false;
for ($i = 0; $i<strlen($q); ++$i)
  switch ($q{$i}) {
    case '\\':++$i;continue;
    case '"':;
    case "'":;
    case '`':if ($q{$i} === $f) {
               echo "start=$pos\tend=$i\t".substr($q,$pos+1,$i-$pos-1)."\n";
               $f = false;
             }
             elseif ($f) continue;
             else $f = $q{$pos = $i};
  }
Возможно, это можно сделать и с помощью регулярок - но суть конечного автомата от этого не изменится.
В любом случае разумнее было бы связаться с авторами и сказать им о необходимой функциональности - система получилась бы более гибкой и без костылей.

Всего записей: 2302 | Зарегистр. 14-05-2004 | Отправлено: 10:13 15-01-2006 | Исправлено: SiMM, 10:21 15-01-2006
Invizz

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо большое, я сам уже разобрался, но решение действительно плохое:
 
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);
 
 
 
Создается много лишних функций, и вообще, чоень медленно.  
 
Сейчас, я думаю пойти по другому пути: экранировать специальные слова внутри кавычек. так лучше будет.

Всего записей: 135 | Зарегистр. 10-04-2005 | Отправлено: 11:18 15-01-2006
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » preg_replace задачка


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

LiteCoin: LgY72v35StJhV2xbt8CpxbQ9gFY6jwZ67r

Рейтинг.ru

Рейтинг.ru