我正在寻找一个正则表达式,它可以准确地识别源代码中引用传递的任何PHP调用时间,以帮助迁移到PHP 5.3。
目前,我有[^=&]\s*&\s*\$
,但这不会过滤分配案例($var = &$othervar;
)。
这个正则表达式应该与eclipse兼容(对不起,不确定regexp eclipse的解析方式)。
编辑:这个有点接近(虽然有点黑客):(?<!([&=]\s{0,15}))&\s*\$
答案 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
,则无需检查参数数组是否包含引用。在数组中传递引用不被视为通过引用传递的调用时间,并且完全正常。