РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ: получение содержимого переменной PHP, самого назначения. В частности, поиск переменных с помощью запросов SQL

#php #regex #variables #variable-assignment

#php #регулярное выражение #переменные #переменная-присвоение

Вопрос:

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

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

Мне нужно найти все SQL-запросы в коде PHP после прочтения его с помощью a 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*[ -*/%.amp;|^<>]*=s*';
  

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

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

Ни один из них не работает правильно.

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

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

Отметьте.

Редактировать:

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

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

 $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 ...
...
';
  

или

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

Я должен получить их ВСЕ. По крайней мере, максимизировать результаты … ^^ ‘

Ответ №1:

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

Ответ №2:

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

 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
"