Существуют ли инструменты парсера PHP DocBlock?

Я хотел бы создать несколько небольших, но высоко настраиваемых сайтов документации для нескольких проектов. PhpDocumentor довольно велик, но он очень тяжелый. Я подумал о том, чтобы попытаться настроить шаблоны для этого, но, потратив всего пару минут на это, я решил, что это будет слишком много работы.

В идеале я бы хотел увидеть что-то, с чем я мог бы передать кучу файлов, и вернуть все файлы, классы, свойства и методы вместе со своими метаданными, чтобы я мог создавать простые шаблоны на основе данных.

Существуют ли какие-либо проекты только для парсеров DocBlock, которые помогут мне в этой задаче, или я не заново изобретаю это колесо?

Ответ 1

Вы можете легко сделать это с помощью Reflection API:

/**
 * 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.

Ответ 2

Если кто-то нуждается в регулярном выражении (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);

Ответ 3

Просто обновить ответы. Вы также можете проверить проект phpDocumentor2. Я думаю, что это парсер PHP DocBlock можно легко извлечь как автономное решение.

Ответ 4

Как отметил furgas , я использовал 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'));

Ответ 5

Кажется, вам нужен парсер PHP, который может экспортировать конкретные сведения о том, что было проанализировано.

Наш Semantic Designs PHP Front End предоставляет полный парсер PHP 4/5 (по состоянию на 2016 год входит PHP 7). Он анализирует исходный код PHP, строит абстрактные синтаксические деревья, тиснение каждого node с точными данными о местоположении и делает их доступными для дальнейшего использования. Одно общее, что он может сделать, это распечатать любое поддерево обратно в качестве исходного текста.

В вашем случае вы хотите просмотреть деревья, найти классы/методы/свойства (как узлы дерева) и распечатать исходный текст вместе с информацией о местоположении. Я думаю, что это обеспечит именно то, что вы хотите.