我一直在嘗試使用正則表達式來匹配PHP註釋。正則表達式匹配PHP評論
//([^<]+)\r\n
這就是我得到的,但它並沒有真正的工作。
香港專業教育學院還試圖
//([^<]+)\r
//([^<]+)\n
//([^<]+)
...無濟於事
我一直在嘗試使用正則表達式來匹配PHP註釋。正則表達式匹配PHP評論
//([^<]+)\r\n
這就是我得到的,但它並沒有真正的工作。
香港專業教育學院還試圖
//([^<]+)\r
//([^<]+)\n
//([^<]+)
...無濟於事
你可能需要難逃 「//」:
\/\/([^<]+)
雖然它只匹配一個評論。它不會在文檔中找到它們 – 2009-07-27 17:31:23
在什麼程序是你的編碼這個正則表達式?如果你擔心換行符不起作用,你的最後一個例子是一個很好的理智檢查。 (我不知道你爲什麼不允許低於您的評論。我假設這是特定於應用程序)
嘗試
//[^<]+
,看看是否可行。正如Draemon說的,你可能不得不逃離對角線。您可能還必須跳過括號。我不知道你是否知道這一點,但括號經常用於包含捕獲組。最後,檢查雙斜線後是否至少有一個字符。
要匹配的意見,你要覺得有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
(你「只是」可能剝離//
和/* */
,但這是 由你決定 ;至少,你已經提取了意見^^)
如果你真的想檢測沒有任何一種奇怪的錯誤的原因是「奇怪」的語法的意見,我想這將是一段;-)
方式這將匹配在PHP註釋行(/ * * /和//格式)
/(\/\*).*?(\*\/)|(\/\/).*?(\n)/s
要獲得所有比賽中,使用preg_match_all獲得比賽的陣列。
可以使用關於您想要實現的內容的更多信息,以及與*匹配*的語言。 – Draemon 2009-07-27 17:31:00