Как найти все переменные 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). Также есть хорошая книга под названием «Освоение регулярных выражений», которую я могу предложить для чтения.
См. Также:
Большое спасибо за ответы, которые мне очень помогли.
Вот уточненная версия регулярного выражения, расширяющая находки к переменным массива с не менее числовыми индексами и предшествующим логическим отрицанием:
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]