У меня проблема с захватом в регулярных выражениях:
Есть функция:
$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 символа?
В качестве альтернативного решения посмотрите в сторону использования штатного средства разбивки на лексемы.
Пример вытаскивания конкретного поля из 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]);
}
Постройте шаблон таким образом: '~(?<=\s)[^*/]+(?=\b)~i'
И тогда будут найдены все необходимые вхождения, без использования подмасок.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
На почту приходят все данные, фотографии в виде base64 строкиКак сделать чтобы они были как прикрепленные изображения? Спасибо!
Доброго всем времени суток! Подскажите, как можно обратиться к массиву еще на уровень глубже? Есть $data['Stats'], в нем есть еще 1 массив с таким...