PHPdoc Регулярное выражение

160
30 сентября 2017, 23:14

У меня проблема с захватом в регулярных выражениях:

Есть функция:

$f = function($doc)
{
 $data = [];
 preg_match_all("/[\s]*[\/\*\s]*(.+)[\/\*\s]*/i", $doc, $matches);
 var_dump($matches);
};

Парсим php doc блок такого вида:

$f("
    /**
     * test
     *
     * @param string \$comment
     *
     * @return array
     */
     ");

Дамп (тут все как и должно быть).

array(3) {
    [0]=>
    string(4) "test"
    [1]=>
    string(22) "@param string $comment"
    [2]=>
    string(13) "@return array"
  }

Если распарсить блок такого вида:

$f("/** @var array ___TEST___ */");

То в конце захватываются ненужные символы: пробел и */ ( */), хотя в правиле регулярного выражения это прописано [\/\*\s]*/i

array(1) {
    [0]=>
    string(34) "@var array ___TEST___ */"
  }

Как исправить данное выражение, чтобы оно не захватывало эти последние 3 символа?

Answer 1

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

Пример вытаскивания конкретного поля из PHPDoc в списке файлов .php

if ($token[0] === T_DOC_COMMENT && preg_match('/@api-call/m', $token[1]) !== 0) {
    $method = preg_replace("/.*@api-call\s+(\w+).*/s", "$1", $token[1]);
}
Answer 2

Постройте шаблон таким образом: '~(?<=\s)[^*/]+(?=\b)~i' И тогда будут найдены все необходимые вхождения, без использования подмасок.

READ ALSO
Изображения в аттечменте php

Изображения в аттечменте php

На почту приходят все данные, фотографии в виде base64 строкиКак сделать чтобы они были как прикрепленные изображения? Спасибо!

185
Сделать поиск по массиву php

Сделать поиск по массиву php

Доброго времени суток

264
Разбор массива php , json

Разбор массива php , json

Доброго всем времени суток! Подскажите, как можно обратиться к массиву еще на уровень глубже? Есть $data['Stats'], в нем есть еще 1 массив с таким...

227