计算给定dir的.php文件中的所有代码行

时间:2011-02-25 00:44:22

标签: php

如何制作一个给定目录的小函数,它返回\r\n之间.php<?php and ?>个文件的行数(echo countsLineOfCode('D:/dir/code/'); // returns 323; )?

用法:

{{1}}

4 个答案:

答案 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 AnswerRecursiveDirectoryIterator的文档。

开始工作
$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 );