English 中文(简体)
Regexp检测PHP源代码中引用的调用时间传递
原标题:Regexp to detect call time pass by references in PHP source code

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

目前,我有[^=&;]s*&;s*$,但这不会过滤出赋值情况($var=&;$othervar;)。

这个正则表达式应该与eclipse兼容(抱歉,不确定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) 

在<code>call_user_func_callable</code>的情况下,无需检查参数数组是否包含引用。在数组中传递引用不被视为逐引用传递调用时间,完全可以。





相关问题
Brute-force/DoS prevention in PHP [closed]

I am trying to write a script to prevent brute-force login attempts in a website I m building. The logic goes something like this: User sends login information. Check if username and password is ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

定值美元

如何确认来自正确来源的数字。

Generating a drop down list of timezones with PHP

Most sites need some way to show the dates on the site in the users preferred timezone. Below are two lists that I found and then one method using the built in PHP DateTime class in PHP 5. I need ...

Text as watermarking in PHP

I want to create text as a watermark for an image. the water mark should have the following properties front: Impact color: white opacity: 31% Font style: regular, bold Bevel and Emboss size: 30 ...

How does php cast boolean variables?

How does php cast boolean variables? I was trying to save a boolean value to an array: $result["Users"]["is_login"] = true; but when I use debug the is_login value is blank. and when I do ...

热门标签