2009-07-27 76 views
0

我一直在嘗試使用正則表達式來匹配PHP註釋。正則表達式匹配PHP評論

//([^<]+)\r\n 

這就是我得到的,但它並沒有真正的工作。

香港專業教育學院還試圖

//([^<]+)\r 
//([^<]+)\n 
//([^<]+) 

...無濟於事

+2

可以使用關於您想要實現的內容的更多信息,以及與*匹配*的語言。 – Draemon 2009-07-27 17:31:00

回答

0

你可能需要難逃 「//」:

\/\/([^<]+) 
+0

雖然它只匹配一個評論。它不會在文檔中找到它們 – 2009-07-27 17:31:23

1

在什麼程序是你的編碼這個正則表達式?如果你擔心換行符不起作用,你的最後一個例子是一個很好的理智檢查。 (我不知道你爲什麼不允許低於您的評論。我假設這是特定於應用程序)

嘗試

//[^<]+ 

,看看是否可行。正如Draemon說的,你可能不得不逃離對角線。您可能還必須跳過括號。我不知道你是否知道這一點,但括號經常用於包含捕獲組。最後,檢查雙斜線後是否至少有一個字符。

1

要匹配的意見,你要覺得有PHP 5中兩種類型的註釋:

  • 評論它通過//開始,然後轉到線的末端
  • 意見,通過/*和啓動去*/

考慮到你有這兩條線第一:

$filePath = '/home/squale/developpement/astralblog/website/library/HTMLPurifier.php'; 
$str = file_get_contents($filePath); 

你可以配合首當其衝:

$matches_slashslash = array(); 
if (preg_match_all('#//(.*)$#m', $str, $matches_slashslash)) { 
    var_dump($matches_slashslash[1]); 
} 

而第二者有:

$matches_slashstar = array(); 
if (preg_match_all('#/\*(.*?)\*/#sm', $str, $matches_slashstar)) { 
    var_dump($matches_slashstar[1]); 
} 

但你可能會得到進入串(what about heredoc syntax, btw, did you think about that one ?)中間用「//」的煩惱,或「切換意見」是這樣的:

/* 
echo 'a'; 
/*/ 
echo 'b'; 
//*/ 

(只是在被添加斜線gining以「撥動」兩大塊,如果你不知道的伎倆)

所以......很防不勝防的意見,只有正則表達式...


另一種方法是使用PHP Tokenizer,顯然,它知道如何解析PHP代碼和註釋。

對於參考,請參閱:

有了這一點,你將不得不使用標記生成器在您的PHP代碼串,重複所有你得到的令牌作爲結果,並檢測哪些是評論。

像這樣的事情可能會做:

$tokens = token_get_all($str); 

foreach ($tokens as $token) { 
    if ($token[0] == T_COMMENT 
     || $token[0] == T_DOC_COMMENT) { 
     // This is a comment ;-) 
     var_dump($token); 
    } 
} 

而且,作爲輸出,你會得到這樣的東西的清單:

array 
    0 => int 366 
    1 => string '/** Version of HTML Purifier */' (length=31) 
    2 => int 57 

或本:

array 
    0 => int 365 
    1 => string '// :TODO: make the config merge in, instead of replace 
' (length=55) 
    2 => int 117 

(你「只是」可能剝離///* */,但這是 由你決定 ;至少,你已經提取了意見^^)

如果你真的想檢測沒有任何一種奇怪的錯誤的原因是「奇怪」的語法的意見,我想這將是一段;-)

方式
0

這將匹配在PHP註釋行(/ * * /和//格式)

/(\/\*).*?(\*\/)|(\/\/).*?(\n)/s 

要獲得所有比賽中,使用preg_match_all獲得比賽的陣列。