2013-03-12 47 views
-2

我正在爲svn跟蹤系統編寫代碼。我想要統計開發人員提供的評論數量。php獲取代碼中的評論行數

是否有一個PHP函數來獲取兩個字符之間的行數? 我想要得到/ *和*/

之間的線數

在此先感謝。

+0

'echo count(explode(「\ n」,trim($ str)));' – slash197 2013-03-12 11:32:48

+0

如果您想知道代碼中有多少條評論,只需要計算'/ *'和'//'(和以'#'開始的行) - 這將是近似的(因爲'//'可能在'/ * ... * /'或嵌套註釋,字符串等等內),但可能接近實際。否則,爲了獲得真正的計數,你必須實現一次自動讀取字符,並考慮字符串開始/結束,嵌套註釋等。 – 2013-03-12 11:33:29

回答

1

您可以使用Tokenizer解析PHP源文件,然後計算註釋。

$source = file_get_contents('source.php'); 
$tokens = token_get_all($source); 
$comments = array_filter($tokens, function($token) { 
    return $token[0] === T_COMMENT; 
}); 

echo "Number of comments: " . count($comments); 

注意,這個計算的評論的數量,以另外算你將不得不在$token[1]計數換行符的行數(實際的評論)。

更新

我想嘗試一下,在這裏你去:

$source = <<<PHP 
<?php 
/* 
* comment 1 
*/ 
function f() { 
    echo 'hello'; // comment 2 
    // comment 3 
    echo 'hello'; /* OK, this counts as */ /* three lines of comments */ // because there are three comments 
} 
PHP; 

$tokens = token_get_all($source); 
$comments = array_filter($tokens, function($token) { 
    return $token[0] === T_COMMENT; 
}); 
$lines = array_reduce($comments, function(&$result, $item) { 
    return $result += count(explode("\n", trim($item[1]))); 
}, 0); 

echo "Number of comments: ", count($comments), "\n"; 
echo "Lines of comments: ", $lines; 

輸出

Number of comments: 6 
Lines of comments: 8 

Online Demo

0

您可以使用preg_replace刪除/* */標記之間的所有內容,然後對行進行計數。

<?php 
$string = <<<END 
just a test with multiple line 

/* 
some comments 

test 
*/ 

and some more lines 
END; 

$lines = explode(chr(10), $string); 
echo 'line count: ' . (count($lines)+1) . '<br>'; 
//line count: 10 

$pattern = '/\/\*(.*)\*\//s'; 
$replacement = ''; 
$string = preg_replace($pattern, $replacement, $string); 


$lines = explode(chr(10), $string); 
echo 'line count: ' . (count($lines)+1); 
//line count: 6 
?>