Получить комментарии в файле 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
*/

Сделать это нормальным блок комментариев вместо блока комментариев документа.
И это также позволило мне использовать ":" в качестве шаблона для функции разделения.

В глазах некоторых это может быть "не так эффективно". Как отметила Фиила, "что, если ваш стиль комментариев изменится?". Я буду единственным, кто будет работать над этим проектом и писать плагины. Поэтому мне тоже не составит большого труда сохранить стиль комментариев одинаковым в каждом скрипте плагина.
Этот метод отлично работает для меня.

Спасибо вам всем за вашу помогите в этом деле.

Author: Gabi Barrientos, 2012-07-16

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];
}
 6
Author: feeela, 2012-07-16 13:03:54

Попробуйте использовать http://ca3.php.net/manual/en/class.reflectionclass.php

И http://ca3.php.net/manual/en/class.reflectionfunction.php

Это все, что вам нужно, чтобы получить параметры функции.

 3
Author: Bartosz Grzybowski, 2012-07-16 12:44:40