我想要使用權杖分析器函式來計算程式碼的行數,包含計算註解。嘗試使用正規表示式來執行此操作效果不佳,因為 /* 可能出現在字串中,或其他情況。 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 />');
}
}
?>
我相信您可以利用這些函式計算程式碼行數和註釋行數。這比我之前嘗試使用正規表達式計算程式碼行數有了巨大的改進。我希望這能幫助到其他人,因為過去這個網站上許多使用者提供的範例都幫助了我。