Я хотел бы создать несколько небольших, но высоко настраиваемых сайтов документации для нескольких проектов. PhpDocumentor довольно велик, но он очень тяжелый. Я подумал о том, чтобы попытаться настроить шаблоны для этого, но, потратив всего пару минут на это, я решил, что это будет слишком много работы.
В идеале я хотел бы увидеть что-то, в которое я мог бы передать кучу файлов, и вернуть все файлы, классы, свойства и методы вместе со своими метаданными, чтобы я мог создавать некоторые простые шаблоны, основанные на данные.
Существуют ли какие-либо проекты парсера DocBlock, которые помогут мне в этой задаче, или я застрял в создании этого колеса?
Вы можете легко сделать это с помощью API Reflection:
/** * This is an Example class */ class Example { /** * This is an example function */ public function fn() { // void } } $reflector = new ReflectionClass('Example'); // to get the Class DocBlock echo $reflector->getDocComment() // to get the Method DocBlock $reflector->getMethod('fn')->getDocComment();
См. Этот учебник: http://www.phpriot.com/articles/reflection-api
Существует также пакет PEAR, который может анализировать DocBlocks.
В случае, если кто-то нуждается в регулярном выражении ( xdazz предложил попробовать это, и student310 прокомментировал, что он работает для его / ее потребностей)
if (preg_match_all('/@(\w+)\s+(.*)\r?\n/m', $str, $matches)){ $result = array_combine($matches[1], $matches[2]); }
Пример ( демонстрация ) :
<?php $str =' /** * @param integer $int An integer * @return boolean */ '; if (preg_match_all('/@(\w+)\s+(.*)\r?\n/m', $str, $matches)){ $result = array_combine($matches[1], $matches[2]); } var_dump($result);
Просто обновить ответы. Вы также можете проверить проект phpDocumentor2 . Я думаю, что это парсер PHP DocBlock можно легко извлечь как автономное решение.
Как отметил фургас, я много лет использую phpDocumentor как самостоятельный проект, и он отлично работает.
<?php $class = new ReflectionClass('MyClass'); $phpdoc = new \phpDocumentor\Reflection\DocBlock($class); var_dump($phpdoc->getShortDescription()); var_dump($phpdoc->getLongDescription()->getContents()); var_dump($phpdoc->getTags()); var_dump($phpdoc->hasTag('author')); var_dump($phpdoc->hasTag('copyright'));
Кажется, вам нужен парсер PHP, который может экспортировать конкретные детали того, что было проанализировано.
Наши семантические проекты PHP Front End предоставляет полный парсер PHP 4/5 (по состоянию на 2016 год входит PHP 7). Он анализирует исходный код PHP, строит абстрактные деревья синтаксиса, штамповки каждого узла с точной информацией о местоположении и делает их доступными для дальнейшего использования. Одно общее, что он может сделать, это распечатать любое поддерево обратно в качестве исходного текста.
В вашем случае вы хотите сканировать по деревьям, найти классы / методы / свойства (как узлы дерева) и распечатать исходный текст вместе с информацией о местоположении. Я думаю, это обеспечит именно то, что вы хотите.