我想要使用标记器函数来计算源代码行数,包括计算注释。尝试使用正则表达式来完成此任务效果不佳,因为在字符串中出现 /* 或其他情况。token_get_all() 函数通过正确检测所有注释使此任务变得容易。但是,它不会标记换行符。我编写了以下一组函数来将换行符也标记为 T_NEW_LINE。
<?php
define('T_NEW_LINE', -1);
function token_get_all_nl($source)
{
$new_tokens = array();
$tokens = token_get_all($source);
foreach ($tokens as $token)
{
$token_name = is_array($token) ? $token[0] : null;
$token_data = is_array($token) ? $token[1] : $token;
if ($token_name == T_CONSTANT_ENCAPSED_STRING || substr($token_data, 0, 2) == '/*')
{
$new_tokens[] = array($token_name, $token_data);
continue;
}
$split_data = preg_split('#(\r\n|\n)#', $token_data, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
foreach ($split_data as $data)
{
if ($data == "\r\n" || $data == "\n")
{
$new_tokens[] = array(T_NEW_LINE, $data);
}
else
{
$new_tokens[] = is_array($token) ? array($token_name, $data) : $data;
}
}
}
return $new_tokens;
}
function token_name_nl($token)
{
if ($token === T_NEW_LINE)
{
return 'T_NEW_LINE';
}
return token_name($token);
}
?>
示例用法
<?php
$tokens = token_get_all_nl(file_get_contents('somecode.php'));
foreach ($tokens as $token)
{
if (is_array($token))
{
echo (token_name_nl($token[0]) . ': "' . $token[1] . '"<br />');
}
else
{
echo ('"' . $token . '"<br />');
}
}
?>
我相信你可以弄清楚如何使用这些函数来计算代码行和注释行。这对我之前使用正则表达式来计算代码行的尝试来说是一个巨大的改进。我希望这能帮助到某些人,因为过去网站上许多用户贡献的示例帮助过我。