Please consider the following code with which I'm trying to parse only the first phpDoc style comment (not using any other libraries) in a file (file contents put in $data variable for testing purposes):
$data = "
/**
* @file A lot of info about this file
* Could even continue on the next line
* @author [email protected]
* @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('/@([a-z]+)\s+(.*?)\s*(?=$|@[a-z]+\s)/s', $data, $matches);
$info = array_combine($matches[1], $matches[2]);
print_r($info)
This almost works, except for the fact that everything after @todo (including the bar()
comment block and code) is considered the value of @todo
:
Array (
[file] => A lot of info about this file Could even continue on the next line
[author] => [email protected]
[version] => 2010-05-01
[todo] => do stuff... /
/** Comment bij functie bar()
[param] => Array met dingen /
function bar() {
echo ;
}
)
How does my code need to be altered so that only the first comment block is being parsed (in other words: parsing should stop after the first "*/" encountered?
Writing a parser using PCRE will lead you to troubles. I would suggest to rely on the tokenizer or reflection first. Then it is safer to actually implement a parser for the doc block, which can handle all situations supported by the phpdoc format (what all libs ended to do as well).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With