Получить комментарии в файле php
Я пытался получить комментарии из определенного файла .php
на моем сервере, чтобы проанализировать его переменные. Я думал, что нашел простой способ сделать это, однако функция, которую я использую, ничего не возвращает, хотя у меня явно есть комментарии в файле.
Вот комментарии, которые я использую:
/**
* @param foo bar
* @return baz
*/
Вот мой код:
function GetComments($filename) {
$expr = "/((?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:\/\/.*))/";
$file = fopen($filename, "r");
$length = filesize($filename);
$comments = fread($file, $length);
fclose($file);
preg_match_all($expr, $comments, $matches);
foreach($matches[0] as $id => $variable){
$comments = str_replace($variable,'',$comments);
}
return $comments;
}
Я что-то делаю не так? Потому что если это так, то я явно перестарался.
Любая помощь была бы очень добро пожаловать.
ИЗМЕНИТЬ:
Я нашел ответ:
Прежде всего, я, вероятно, должен был отметить в своем вопросе, что я пытаюсь написать систему для чтения плагинов. Эти файлы плагинов должны содержать блок комментариев вверху, содержащий такие переменные, как автор плагина, веб-сайт, электронная почта и т.д.
Итак, вот что я сделал:
Я взял пример фиелы, чтобы изменить свою функцию, чтобы получить комментарии и ее переменные.
Затем я немного изменил его код, чтобы он соответствовал моему потребности:
public function GetComments($filename)
{
$docComments = array_filter(token_get_all(file_get_contents($filename)), function($entry)
{
return $entry[0] == T_COMMENT;
});
$fileDocComment = array_shift($docComments);
$regexp = "/\@.*\:\s.*\r/";
preg_match_all($regexp, $fileDocComment[1], $matches);
for($i = 0; $i < sizeof($matches[0]); $i++)
{
$params[$i] = split(": ", $matches[0][$i]);
}
return($params);
}
Я помещаю результат кода, который дала мне фила, в соответствие с регулярным выражением, в результате чего получается массив, содержащий параметры и их значения вместе взятые.
Затем я использовал функцию разделения, чтобы фактически предоставить мне отдельные параметры и значения, чтобы я мог вернуть их в переменную, которая вызвала функцию.
Для того, чтобы это работало должным образом, мне нужно было изменить стиль комментариев, который я использовал с
/**
* @param foo bar
* @return baz
*/
До
/*
@param: foo bar
@return: baz
*/
Сделать это нормальным блок комментариев вместо блока комментариев документа.
И это также позволило мне использовать ":" в качестве шаблона для функции разделения.
В глазах некоторых это может быть "не так эффективно". Как отметила Фиила, "что, если ваш стиль комментариев изменится?". Я буду единственным, кто будет работать над этим проектом и писать плагины. Поэтому мне тоже не составит большого труда сохранить стиль комментариев одинаковым в каждом скрипте плагина.
Этот метод отлично работает для меня.
Спасибо вам всем за вашу помогите в этом деле.
2 answers
Вы можете использовать token_get_all()
, который "анализирует заданную исходную строку PHP в языковые токены с помощью лексического сканера Zend engine".
См.: http://php.net/token_get_all
Вот пример функции, которую я однажды использовал, чтобы получить комментарий file-doc из текущего файла:
/**
* Return first doc comment found in this file.
*
* @return string
*/
function getFileDocBlock()
{
$docComments = array_filter(
token_get_all( file_get_contents( __FILE__ ) ), function($entry) {
return $entry[0] == T_DOC_COMMENT;
}
);
$fileDocComment = array_shift( $docComments );
return $fileDocComment[1];
}
Попробуйте использовать http://ca3.php.net/manual/en/class.reflectionclass.php
И http://ca3.php.net/manual/en/class.reflectionfunction.php
Это все, что вам нужно, чтобы получить параметры функции.