Я пытался получить комментарии из определенного .php
файла на моем сервере, чтобы разобрать его переменные. Я думал, что Ii нашел простой способ сделать это, однако функция, которую я использую, ничего не возвращает, хотя у меня явно есть комментарии в файле.
Вот комментарии, которые я использую:
/** * @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); }
Я поставил результат кода, который мне дал через регулярное выражение, в результате чего массив, содержащий параметры и их значения, был объединен.
Затем я использовал функцию split, чтобы дать мне отдельные параметры и значения, поэтому я мог бы вернуть их к переменной, называемой функцией.
Чтобы это правильно работало, мне нужно было изменить стиль комментария, который я использовал
/** * @param foo bar * @return baz */
в
/* @param: foo bar @return: baz */
что делает его нормальным блоком комментариев, а не блоком комментариев doc.
И это также позволило мне использовать ':' как шаблон для функции split.
Это может быть «не так эффективно» в глазах некоторых. Как отметил г-жа Валле, «что изменится ваш стиль комментариев?». Я буду единственным, кто работает над этим проектом и написав плагины. Поэтому для меня не слишком сложно сохранить стиль комментария одинаковым в каждом сценарии плагина.
Этот метод отлично работает для меня.
Спасибо всем за вашу помощь в этом.
Вы можете использовать token_get_all()
, который «анализирует данную исходную строку PHP в token_get_all()
языка, используя лексический сканер двигателя Zend».
См .: http://php.net/token_get_all
Вот пример, который я использовал один раз, чтобы получить файл-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
Это все, что вам нужно, чтобы получить параметры функции.