2013-10-24 3 views
2

Как найти все переменные 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); 

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

+2

Это будет работать в терминах 'regex', но не в терминах' PHP'. Образец: '$% #' будет замаскирован - но это не действительная переменная php. Вы можете ограничить буквенно-числовой буквой '$ ([\ w \ d] +)', но тогда '$ {'foo'}' не будет проверяться. Заключение - это идея _bad_ попытаться реализовать синтаксический синтаксический анализ с помощью regex –

+0

@Alma Do Mundo: «Спасибо» не-жадному совпадению здесь, соответствие нулевых символов для повторения звезды уже делает это. Замечание плохой идеи на самом деле стоит того, я мог бы поставить этот угол в свой ответ и, возможно, предоставить ссылку на [PHP Parser] (https://github.com/nikic/PHP-Parser). – hakre

+1

['token_get_all()'] (http://php.net/manual/en/function.token-get-all.php) также может это сделать. Просто отфильтруйте результаты с помощью 'T_VARIABLE' –

ответ

13
\$(.*?) 

Неправильное регулярное выражение в соответствии с именем переменной PHP. Такой a regular expression for a Variable Name is actually part of the PHP manual и даются как (без ведущего знака доллара):

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

Так что в вашем случае я бы попробовать с:

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

вместо тогда. See the following example:

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

Смотрите так же:

+0

Спасибо за быстрый ответ, я хочу узнать, как работают регулярные выражения, поэтому еще раз спасибо за то, что вы ведете меня в правильном направлении. BTW ваше решение работает. – botenvouwer

+0

@sirwilliam: Я также немного украсил демонстрационный пример и сделал его фактически частью ответа. Как вы видите, это связано, поэтому вы можете использовать его для игры с ним для изучения того, как работает PCRE :) Игра также является хорошим способом обучения. – hakre

+0

Я знаю, играю весь день с php. REXEG - это необитаемое место в моем мозгу. Я попытаюсь изучить его. – botenvouwer

1

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

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

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] 
Смежные вопросы