【问题标题】:Find all PHP Variables with preg_match使用 preg_match 查找所有 PHP 变量
【发布时间】:2013-10-24 10:07:04
【问题描述】:

如何使用preg_match 找到所有 PHP 变量。我做了以下正则表达式:

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

我只是不明白正则表达式是如何工作的。

【问题讨论】:

  • 这适用于regex,但不适用于PHP。示例:$%# 将被捕获 - 但它不是有效的 php 变量。您可以限制为字母数字 $([\w\d]+) - 但随后 ${'foo'} 将无法通过检查。结论 - 尝试使用正则表达式实现语法解析是一个坏主意
  • @Alma Do Mundo:“感谢”这里的非贪婪匹配,星形重复的零字符匹配已经做到了。坏主意说明实际上非常值得,我也可以将这个角度放入我的答案中,并可能提供指向 PHP Parser 的链接。
  • token_get_all() 也可以。只需按T_VARIABLE过滤结果即可

标签: php regex preg-match


【解决方案1】:
\$(.*?)

不是匹配 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) 手册。还有一本好书,名为“掌握正则表达式”,我建议您阅读一下。

参见:

【讨论】:

  • 感谢您的快速响应,我想了解正则表达式的工作原理,再次感谢您引导我朝着正确的方向前进。顺便说一句,您的解决方案有效。
  • @sirwilliam:我还稍微美化了演示示例,并将其作为答案的一部分。如您所见,它已链接,因此您可以使用它来玩弄它以了解 PCRE 的工作原理:) 玩也是一种学习的好方法。
  • 我知道,整天玩 php。 REXEG 在我的脑海中是一个无人居住的地方。我将尝试探索它。
【解决方案2】:

非常感谢您的回答,这对我帮助很大。

这是正则表达式的详细版本,将查找结果扩展为 array-variables,其中至少具有 numeric indices 一个前面的逻辑否定:

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]

【讨论】:

    【解决方案3】:

    感谢hakre 的回答。我将它与更多内容结合起来以匹配 PHP 数组变量和面向对象的变量:

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

    这应该匹配以下变量:

    $this->that
    $this["sure"]["thing"][0]
    $var
    $_GET["id"]
    

    【讨论】:

      【解决方案4】:

      要查找所有变量(包括数组变量),您可以使用正则表达式(perl):

      \$([a-zA-Z_\x7f-\xff]*)\[([a-zA-Z]{1}[a-zA-Z0-9_]{1,32})\]

      如果你想替换它们,包括单引号,你替换它们:

      \$$1['$2']

      【讨论】:

      • 这与有效变量$var不匹配,但匹配无效$[ab]
      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多