2012-04-12 38 views
0

我希望掃描字符串Firebug的文件,但這不夠。我也希望在QFirebug :: log和QFirebug :: error靜態方法之間做出區別。在PHP_CodeSniffer中查找字符串規則

如何在類名後提取方法名?

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() 

回答

4

如果運行與-vv命令行參數phpcs,你可以看到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_STRING令牌。在這種情況下,一旦你確定$ stackPtr所指向的「螢火蟲」刺痛,只是確認它是一個靜態的呼叫,然後抓住下一個字符串標記:

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_PARENTHESIS和T_CLOSE_PARENTHESIS令牌爲好,以確認是一個函數調用,但它取決於您正在使用的類。

希望有所幫助。