#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 в шаблоне регулярных выражений…
Неважно…
Я не знаю, как это сделать.
-
Получение всей переменной и ее назначения, группирование назначения и после него, перебор совпадений в поисках специальных слов SQL (это то, что у меня есть прямо сейчас, но это не работает из-за части регулярных выражений назначения).
-
Прямой поиск 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
"