用于检测调用时间的正则表达式通过PHP源代码中的引用传递

时间:2010-10-27 17:04:55

标签: php regex eclipse

我正在寻找一个正则表达式,它可以准确地识别源代码中引用传递的任何PHP调用时间,以帮助迁移到PHP 5.3。

目前,我有[^=&]\s*&\s*\$,但这不会过滤分配案例($var = &$othervar;)。

这个正则表达式应该与eclipse兼容(对不起,不确定regexp eclipse的解析方式)。

编辑:这个有点接近(虽然有点黑客):(?<!([&=]\s{0,15}))&\s*\$

5 个答案:

答案 0 :(得分:7)

您可以使用phpcs。它有一个rule to detect Call Time Pass by References

  

确保在调用函数时不通过引用传递变量。

还有plugin to integrate phpcs into Eclipse

使用此在线生成器可以轻松地为PHPCS(和PMD)生成规则集:

答案 1 :(得分:4)

php -l(php-linter)发现调用时传递引用错误,我用过

find -name '*.php' -exec php -l '{}' \; >/dev/null

在linux中

答案 2 :(得分:3)

你无法获得正则表达式。请改用Tokenizer。您需要查找'&'左侧下一个'('(行走时解析括号)前面的T_STRING,而不是T_FUNCTION

$tokens = new TokenStream($source);
foreach ($tokens as $i => $token) {
    if ($token->is(T_AMP)) {
        while ($i--) {
            if ($tokens[$i]->is(T_CLOSE_ROUND, T_CLOSE_SQUARE, T_CLOSE_CURLY)) {
                $i = $tokens->complementaryBracket($i);
            } elseif ($tokens[$i]->is(T_OPEN_ROUND)) {
                if ((($tokens[--$i]->is(T_WHITESPACE) && $tokens[--$i]->is(T_STRING))
                     || $tokens[$i]->is(T_STRING))
                    && !$tokens[--$i]->is(T_WHITESPACE)
                    && !$tokens[--$i]->is(T_FUNCTION)
                ) {
                    throw new Exception('Call-time pass by reference');
                }
                break;
            }
        }
    }
}

这利用my TokenStream wrapper。使用本机输出会变得更加困难;)

答案 3 :(得分:0)

^(?!^.*(function|foreach|array)).*\(.*\&\$.*\)

这应该有所帮助。

答案 4 :(得分:0)

您可以使用此模式:

/(->|::|call_user_func|call_user_func_callable).*\(.*\&\$/

它将匹配以下字符串:

'->($arg1, &$arg2)'
'->(&$arg1, $arg2)'
'::($arg1, &$arg2)'
'::(&$arg1, $arg2)'
'call_user_func($callback, &$arg2)'
'$callback, &$arg2)'
'call_user_func_callable $callback, &$param_arr)'

如果是call_user_func_callable,则无需检查参数数组是否包含引用。在数组中传递引用不被视为通过引用传递的调用时间,并且完全正常。