Найти все переменные PHP с preg_match

Как найти все переменные PHP с preg_match . Я сделал следующее регулярное выражение:

 $string = 'Hallo $var. blabla $var, $iam a var $varvarvar gfg djf jdfgjh fd $variable'; $instring = array(); preg_match_all('/\$(.*?)/', $string, $instring); print_r($instring); 

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

 \$(.*?) 

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

 [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* 

Поэтому в вашем случае я бы попытался:

 \$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*) 

вместо этого. См. Следующий пример :

 <?php /** * Find all PHP Variables with preg_match * * @link http://stackoverflow.com/a/19563063/367456 */ $pattern = '/\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)/'; $subject = <<<'BUFFER' Hallo $var. blabla $var, $iam a var $varvarvar gfg djf jdfgjh fd $variable BUFFER; $result = preg_match_all($pattern, $subject, $matches); var_dump($result); print_r($matches); 

Вывод:

 int(5) Array ( [0] => Array ( [0] => $var [1] => $var [2] => $iam [3] => $varvarvar [4] => $variable ) [1] => Array ( [0] => var [1] => var [2] => iam [3] => varvarvar [4] => variable ) ) 

Если вы хотите понять, как работают регулярные выражения в PHP, вы должны прочитать это в Руководстве по PHP, а также в руководстве используемого диалекта регулярного выражения (PCRE). Также есть хорошая книга под названием «Освоение регулярных выражений», которую я могу предложить для чтения.

См. Также:

  • PHP Syntax Regulary Express (ноябрь 2010, by hakre)
  • PHP PCRE
  • PCRE – совместимые регулярные выражения Perl

Большое спасибо за ответы, которые мне очень помогли.

Вот уточненная версия регулярного выражения, расширяющая находки к переменным массива с не менее числовыми индексами и предшествующим логическим отрицанием:

 function get_variables_from_expression($exp){ $pattern = '/((!\$|\$)[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*[0-9\[\]]*)/'; $result = preg_match_all($pattern,$exp,$matches); return($matches[0]); } $example = '(($aC[5][7][1]xor((((!$a[5]&&!$a[4])&&!$a[3])&&!$a[2])&&$aC[6][6][0]))xor$aC[6][6][2])'; $list = get_variables_from_expression($example); foreach($list as $var){ echo "$var<br>"; } 

результаты:

 $aC[5][7][1] !$a[5] !$a[4] !$a[3] !$a[2] $aC[6][6][0] $aC[6][6][2]