Regexp для определения времени вызова по ссылкам в исходном коде PHP

Я ищу регулярное выражение, которое будет точно идентифицировать любой проход времени вызова PHP по ссылкам в исходном коде, чтобы помочь перейти на PHP 5.3.

В настоящее время у меня есть [^=&]\s*&\s*\$ , но это не отфильтровывает случаи присваивания ( $var = &$othervar; ).

Это регулярное выражение должно быть совместимо с eclipse (извините, не уверен, какой вкус анализа регулярного выражения затмения).

Изменить: этот немного ближе (хотя и немного взломан): (?<!([&=]\s{0,15}))&\s*\$

Вы можете использовать phpcs для этого. У этого есть правило, чтобы определить время вызова по ссылкам :

Обеспечивает, чтобы переменные не передавались по ссылке при вызове функции.

Существует также плагин для интеграции phpcs в Eclipse

Генерирование наборов правил для PHPCS (и PMD) легко с помощью этого онлайн-генератора:

php -l (php-linter) обнаруживает ошибки обратного вызова во время вызова, я использовал

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

в linux

Вы не можете получить тех, у кого есть регулярное выражение. Вместо этого используйте 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; } } } } 

Это использует мою обертку TokenStream . С собственным выходом это будет немного сложнее;)

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

Это должно помочь.

Вы можете использовать этот шаблон:

 /(->|::|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 нет необходимости проверять, содержит ли массив параметров ссылки. Передача ссылок в массиве не считается временем вызова по ссылке и полностью прекрасным.