Artykuły na każdy temat
[PHP] Liczenie komentarzy w kodzie źródłowym
<?php
$dir = '../path_to_project/';
$prohibited_dirs = ['/libs/', '/templates_c/'];
header('Content-Type: text/plain; charset=utf-8');
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::UNIX_PATHS | FilesystemIterator::SKIP_DOTS)) as $file_info)
{
if($file_info -> getExtension() === 'php')
{
$path = substr($file_info -> getPathname(), strlen($dir));
if($path[0] !== '/')
{
$path = '/'.$path;
}
foreach($prohibited_dirs as $prohibited_dir)
{
if(substr($path, 0, strlen($prohibited_dir)) === $prohibited_dir)
{
$path = null;
break;
}
}
if($path !== null)
{
foreach(token_get_all(file_get_contents($file_info -> getPathname())) as $token)
{
if(in_array($token[0], [T_COMMENT, T_DOC_COMMENT]) === true)
{
// One-line C++ style comments
if(substr($token[1], 0, 2) === '//')
{
++$comments[$path]['double_slash'];
}
// One-line Shell style comments
else if(substr($token[1], 0, 1) === '#')
{
++$comments[$path]['hash'];
}
// Multi-line comments
else
{
++$comments[$path]['multi_line'];
}
}
}
}
}
}
var_dump($comments);
?>
Nigdy bym nie pomyślał, że funkcja token_get_all() może być tak przydatna. W $token[1] mamy zawartość komentarza, który także można wrzucić do tablicy. Jeżeli taka jest potrzeba to warto zastosować trim() i ewentualnie uciąć niepotrzebne znaki. Gdyby ktoś pytał o zastosowani funkcji token_get_all() to podpowiadam, że stosuję się ją np. do tworzenia tzw. sandboxów. Szkoda, że nie ma predefiniowanych stałych na konkretne typy komentarzy no ale...
Komentarze
Dodaj komentarz