如何制作一个给定目录的小函数,它返回\r\n
之间.php
个<?php and ?>
个文件的行数(echo countsLineOfCode('D:/dir/code/');
// returns 323;
)?
用法:
{{1}}
答案 0 :(得分:3)
function countLinesOfCode($path) {
$lines = 0;
$items = glob(rtrim($path, '/') . '/*');
foreach($items as $item) {
if (is_file($item) AND pathinfo($item, PATHINFO_EXTENSION) == 'php') {
$fileContents = file_get_contents($item);
preg_match_all('/<\?(?:php)?(.*?)($|\?>)/s', $fileContents, $matches);
foreach($matches[1] as $match) {
$lines += substr_count($match, PHP_EOL);
}
} else if (is_dir($item)) {
$lines += countLinesOfCode($item);
continue;
}
}
return $lines;
}
var_dump(countLinesOfCode(dirname(__FILE__))); // int(31) (works for me)
保持在我的计算新行,而不是行尾字符;
。例如,下面的行将被视为一行......
var_dump($files); echo 'something'; exit;
它还计算没有任何PHP代码的行,例如:以下代码将是4行...
<?php
$a = 3;
它也不计算<?php
或关闭(如果存在)。
如果(a)不匹配空行,(b)应该匹配半冒号(需要确保它们不出现在字符串中)和/或(c)它应该匹配开头,请告诉我和结束标记(在$matches[1]
到foreach
中更改$matches[0]
很容易。
答案 1 :(得分:1)
PHPLOC
用于快速测量PHP项目大小和分析结构的工具。
答案 2 :(得分:0)
alex函数的递归版本
function countLinesOfCode($path) {
$lines = 0;
$files = glob(rtrim($path, '/') . '/*');
foreach($files as $file) {
if (is_dir($file)){
if ($file=='.' || $file=='..')
continue;
$lines+=countLinesOfCode($file);
} else if (substr($file,-4)!='.php')
continue;
echo 'Counting on ' . $file .'<br>';
$fileContents = file_get_contents($file);
preg_match_all('/<\?(?:php)?(.*?)(?:$|\?>)/s', $fileContents, $matches);
foreach($matches[1] as $match) {
$lines += substr_count($match, PHP_EOL);
}
}
return $lines;
}
答案 3 :(得分:0)
我根据this Answer和RecursiveDirectoryIterator的文档。
开始工作$path = realpath( '/path/to/directory' );
$lines = $files = 0;
$objects = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator( $path ),
RecursiveIteratorIterator::SELF_FIRST
);
foreach( $objects as $name => $fileinfo )
{
if ( !$fileinfo->isFile() )
continue;
if( false === strpos( $name,'.php' ) )
continue;
$files++;
$read = $fileinfo->openFile();
$read->setFlags( SplFileObject::READ_AHEAD );
$lines += iterator_count( $read ) - 1; // -1 gives the same number as "wc -l"
}
printf( "Found %d lines in %d files.", $lines, $files );