Пожалуйста, рассмотрите следующий код, с которым я пытаюсь разобрать только первый комментарий к стилю phpDoc (не используя какие-либо другие библиотеки) в файле (содержимое файла помещается в переменную $ data для целей тестирования):
$data = " /** * @file A lot of info about this file * Could even continue on the next line * @author me@example.com * @version 2010-05-01 * @todo do stuff... */ /** * Comment bij functie bar() * @param Array met dingen */ function bar($baz) { echo $baz; } "; $data = trim(preg_replace('/\r?\n *\* */', ' ', $data)); preg_match_all('/@([az]+)\s+(.*?)\s*(?=$|@[az]+\s)/s', $data, $matches); $info = array_combine($matches[1], $matches[2]); print_r($info)
Это почти работает, за исключением того факта, что все после @todo (включая блок и код комментария bar()
) считается значением @todo
:
Array ( [file] => A lot of info about this file Could even continue on the next line [author] => me@example.com [version] => 2010-05-01 [todo] => do stuff... / /** Comment bij functie bar() [param] => Array met dingen / function bar() { echo ; } )
Как мой код нужно изменить так, чтобы обрабатывался только первый блок комментариев (другими словами: синтаксический разбор должен останавливаться после первого «* /» встреченного?
Написание парсера с помощью PCRE приведет вас к проблемам. Я бы предложил сначала положиться на токенизатор или отражение . Тогда безопаснее фактически реализовать парсер для блока doc, который может обрабатывать все ситуации, поддерживаемые форматом phpdoc (что все закончилось и для всех libs).