REGEXP: получить содержимое переменной PHP, само присвоение.В частности, поиск переменных с помощью SQL-запросов - PullRequest
1 голос
/ 03 ноября 2011

Я думаю, что схожу с ума от этого ...

Я перепробовал много комбинаций и не могу получить хорошую.

Мне нужно найтивсе запросы SQL в коде PHP после прочтения его с помощью file_get_contents().

Конечно, все эти запросы являются переменными, например:

$sql1 = "
  SELECT *
  FROM users u
  WHERE u.name LIKE '%".$name."%' AND ... ;
";

или

$sql2 = "
  SELECT *
  FROM users u
  WHERE u.id = ".$user_id;

или

$sql3 = '
  SELECT *
  FROM users u
  ORDER BY u.surname1 DESC
'; //this query blablabla.......

Итак, вы можете видеть, что есть много факторов, которые нужно учитывать для переменных PHP.

Сначала я попробовал приближение, основанное на получении переменнойсамо по себе в сочетании с получением его содержимого ...

Я также пытался найти конкретные слова из SQL в шаблоне регулярных выражений ...

Что угодно ...

Я не знаю, как это сделать.

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

  2. Прямой поискдля запросов SQL с хорошим регулярным выражением?

Переменные PHP (в частности, строки), содержит частичные конкатенации с другими переменными, строки в двойных и одинарных кавычках, комментарии в конце ";"или в середине ...

Так что же я могу сделать?

Пока что это моя переменная часть регулярного выражения:

$regex_variable = '\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\s*[\+\-\*\/\%\.\&\|\^\<\>]*=\s*';

, которую я объединяю с $ regex_sql, которыйЯ пробовал разные формы:

//$regex_sql = '(["\'])(.*?)\2\s*;';
//$regex_sql = '(["\'])([^;]*?)\2\s*;';
//$regex_sql = '(?<!")\b\w+\b|(?<=")\b[^"]+';
//$regex_sql = '([^;]+)(?<=["\']);(?!["\'])';
//$regex_sql = '(.*?;)[^\\$]*';

Ни одна из этих корректно не работает.

Можете ли вы помочь мне, пожалуйста?Я уверен, что в лучшем приближении он получает все переменные, а после этого проверяет назначение на наличие специальных SQL-слов, таких как SELECT, WHERE, UNION, ORDER, ...

Заранее большое спасибо!

Mark.

edit:

Конечно, переменные с запросами могут иметь любую форму.Вышеприведенные примеры являются простыми примерами.

Мы говорим о таких вещах:

$s = 'insert into tabletest(a,b,c) values('asd','r32r32','fdfdf')';

или

$where = 'where a=2';
$sql="select distinct * from test ".$where;

или

$a = '
select *
from users
left outer join ...
inner join ...
left join ...
where ...
group by ...
having ...
order by ...
limit ...
...
';

или

...

Представьте себе множество программистов, создающих запросы внутри кода, которые делают это по-своему ...: \

У меня естьчтобы получить ВСЕ из них.По крайней мере, максимизируйте результаты ... ^^ '

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

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

0 голосов
/ 03 ноября 2011

Не знаю, если это то, что вы ищете:

preg_match_all('/\$.*?=(.*?)(?<=[\'"]);/s', $subject, $result, PREG_PATTERN_ORDER);
$result = $result[1];

В нем будут все назначения ( назначения ), сохраненные в $ result.Я проверил это со всеми вашими образцами.

Извините, если вы хотели что-то еще.

Объяснение:

"
\$         # Match the character “\$” literally
.          # Match any single character
   *?         # Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
=          # Match the character “=” literally
(          # Match the regular expression below and capture its match into backreference number 1
   .          # Match any single character
      *?         # Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
)
(?<=       # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind)
   ['\"]       # Match a single character present in the list “'\"”
)
;          # Match the character “;” literally
"
...