2014-01-27 4 views
0

Я пытаюсь написать регулярное выражение, которое в приведенном ниже примере будет соответствовать только $ session = $ _POST ['session'];Regex, обнаруживающий глобальные переменные в PHP

Line #1: if (isset($_POST['session'])) {$session = $_POST['session'];} 
Line #2: $session = $_POST['session']; 

Следующая регулярное выражение корректно работает только со второй линии:

(\ $ .) =. (\ $ _ POST. *);

На первой строке это регулярное выражение делает матч с

$_POST['session'])) {$session = $_POST['session']; 

ответ

1

Я представляю ваше регулярное выражение на самом деле было .* вместо просто .

(\$.*)=.(\$_POST.*); 
    ^

.* s are g крайне опасны (с точки зрения соответствия), поскольку они соответствуют чему угодно и насколько это возможно. Из быстрого google я вижу, что

Действительное имя переменной начинается с буквы или подчеркивания, за которой следует любое количество букв, цифр или символов подчеркивания.

Так что я бы посоветовал ограничивать матч самое сочетание букв, цифр и символов подчеркивания (удобно все покрывается \w). Я бы рекомендовал изменить второй .*, чтобы соответствовать только символам до следующего ;, используя [^;]+, чтобы избежать переопределения хвостового конца выражения, а также вместо . для соответствия пробелам явно сопоставлять пробелы с \s*. Оставляя вам:

(\$\w+)\s*=\s*(\$_POST[^;]+); 

RegExr Example

0

Вы можете попробовать:

(\$[^$= ]*) ?= ?(\$_POST\[[^]]*\]) 
+0

согласен, это может быть все, OP хочет, но если вы удалите пробел перед '' {в строке 1 это будет по-прежнему соответствовать неправильно – OGHaza

+0

@OGHaza Спасибо, Я отредактировал мой ответ с улучшением '$ _POST'. – hsz

Смежные вопросы