在PHP_CodeSniffer中查找字符串规则

在PHP_CodeSniffer中查找字符串规则,php,codesniffer,Php,Codesniffer,我希望扫描文件中的字符串Firebug,但这还不够。我还希望区别QFirebug::log和QFirebug::error静态方法 如何在类名之后提取方法名 public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); echo $tokens[$stackPtr]['content']; if ($tokens[$st

我希望扫描文件中的字符串Firebug,但这还不够。我还希望区别QFirebug::log和QFirebug::error静态方法

如何在类名之后提取方法名

public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
{
    $tokens = $phpcsFile->getTokens();
    echo $tokens[$stackPtr]['content'];
    if ($tokens[$stackPtr]['content'] === 'Firebug') {
        $error = 'found ' . $tokens[$stackPtr]['content'];
        $data  = array(trim($tokens[$stackPtr]['content']));
        $phpcsFile->addError($error, $stackPtr, 'Found', $data);
    }

}//end process()

如果使用
-vv
命令行参数运行PHPC,您可以看到PHP文件被分解成的令牌列表。对于像
Firebug::error()这样的行您将获得:

Process token 1 on line 2 [lvl:0;]: T_STRING => Firebug
Process token 2 on line 2 [lvl:0;]: T_DOUBLE_COLON => ::
Process token 3 on line 2 [lvl:0;]: T_STRING => error
Process token 4 on line 2 [lvl:0;]: T_OPEN_PARENTHESIS => (
Process token 5 on line 2 [lvl:0;]: T_CLOSE_PARENTHESIS => )
Process token 6 on line 2 [lvl:0;]: T_SEMICOLON => ;
你没有表现出你的全部嗅觉,但我猜你在寻找t_字符串标记。在本例中,一旦确定$stackPtr指向“Firebug”刺,只需确认它是一个静态调用,然后获取下一个字符串标记:

if ($tokens[$stackPtr]['content'] === 'Firebug'
    && $tokens[($stackPtr + 1)]['code'] === T_DOUBLE_COLON
) {
    // This is a static call to a Firebug class method.
    $methodName = $tokens[($stackPtr + 2)]['content'];
    /* your error code here */
}
或者,如果您认为人们会在双冒号之间放置空格,比如
Firebug::error()
,那么您可以这样做:

if ($tokens[$stackPtr]['content'] === 'Firebug') {
    // Find the next non-whitespace token.
    $colon = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($stackPtr + 1), null, true);
    if ($tokens[$colon]['code'] === T_DOUBLE_COLON) {
        // This is a static call to a Firebug class method.
        $methodName = $phpcsFile->findNext(T_STRING, ($colon + 1));
        /* your error code here */
    }
}
如果您想更进一步,还可以查找T_OPEN_括号和T_CLOSE_括号标记,以确认它是一个函数调用,但这取决于您使用的类


希望对您有所帮助。

如果您使用
-vv
命令行参数运行PHPC,您可以看到PHP文件分解成的令牌列表。对于像
Firebug::error()这样的行您将获得:

Process token 1 on line 2 [lvl:0;]: T_STRING => Firebug
Process token 2 on line 2 [lvl:0;]: T_DOUBLE_COLON => ::
Process token 3 on line 2 [lvl:0;]: T_STRING => error
Process token 4 on line 2 [lvl:0;]: T_OPEN_PARENTHESIS => (
Process token 5 on line 2 [lvl:0;]: T_CLOSE_PARENTHESIS => )
Process token 6 on line 2 [lvl:0;]: T_SEMICOLON => ;
你没有表现出你的全部嗅觉,但我猜你在寻找t_字符串标记。在本例中,一旦确定$stackPtr指向“Firebug”刺,只需确认它是一个静态调用,然后获取下一个字符串标记:

if ($tokens[$stackPtr]['content'] === 'Firebug'
    && $tokens[($stackPtr + 1)]['code'] === T_DOUBLE_COLON
) {
    // This is a static call to a Firebug class method.
    $methodName = $tokens[($stackPtr + 2)]['content'];
    /* your error code here */
}
或者,如果您认为人们会在双冒号之间放置空格,比如
Firebug::error()
,那么您可以这样做:

if ($tokens[$stackPtr]['content'] === 'Firebug') {
    // Find the next non-whitespace token.
    $colon = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($stackPtr + 1), null, true);
    if ($tokens[$colon]['code'] === T_DOUBLE_COLON) {
        // This is a static call to a Firebug class method.
        $methodName = $phpcsFile->findNext(T_STRING, ($colon + 1));
        /* your error code here */
    }
}
如果您想更进一步,还可以查找T_OPEN_括号和T_CLOSE_括号标记,以确认它是一个函数调用,但这取决于您使用的类

希望有帮助