PHP preg_match_all获取短标记之间的变量名称

时间:2017-04-24 12:07:44

标签: php regex preg-match-all

我有使用短标记<?= $some_var; ?>的模板文件。我需要编写一个脚本来获取该模板中使用的变量列表,即:

之类的数组
[
    0 => '$some_var',
    ...
    n => '$some_var_n'
]

我试过了:

preg_match_all('/<?[^p](.*)?>/s', $file_contents, $matches);

和其他一些组合,但没有运气。

感谢。

2 个答案:

答案 0 :(得分:2)

您需要转义?,否则它们会使前面的字符/组成为可选项。您还可以使正则表达式更严格,并将正则表达式用于PHP提供的有效变量名称(http://php.net/manual/en/language.variables.basics.php)。

类似的东西:

<\?=\h+(\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]+);?\h*\?>

应该找到你的变量。

演示:https://regex101.com/r/fVBZAS/1/

答案 1 :(得分:1)

使用token_get_all

function genTempVar($text) {
    $open = false;
    foreach (token_get_all($text) as $v) {
        if ( $open ) {
            if ( $v[0] == T_CLOSE_TAG ) $open = false;
            elseif ( $v[0] == T_VARIABLE ) yield $v[1];
        } elseif ( $v[0] == T_OPEN_TAG_WITH_ECHO ) $open = true; 
    }
} 

print_r(iterator_to_array(genTempVar($text)));