I am writing a regular expression for parsing PHP annotations in a flexible way. Currently
I'd like to accomplish all the goals listed above with one single expression does not trim whitespace or newlines at the end of the value. Any improvements toSo I would appreciate any suggestions about the expression are welcomequality of it (in terms of corner cases, performance, best practices and correctness).
PCRE expression:PCRE expression:
/[\*\s]*@(?P<name>\w+[\\\w]*?)\s?
(?P<value>
(?:
[\w\s\"\<\>\_\#\=\-\.\'\{\}:;,\*\(\)\[\]]*[^\R\*\s\/]
)
(?:\s | $)
)/gsxmu
Sample string:Goals of the regular expression:
- List all annotations with their values
- Values can be multi-lined and have markup (html, json or markdown)
- The initial space + * of each line should be removed from the value
- Many annotations can be in the same line
- Annotation names can be namespaced
Sample PHPDoc string:
/**
* Description
*
* @Tag name name @annotation beee @aaf dsfsd fgdg
* @Tag name name {"json":"dfsf"}
* @Tag asdasd <html> #markdown ==markdown== __markdown__
* - markdown
* > mark 1
.mark
"string"
'string'
* @Annotation()
* @Tag name name @annotation beee @aaf dsfsd fgdg <markdown> #markdown ==markdown==
* @a() @b("name") @c()
* @Annotation\Name("var1()", "var2") @n("name()_name")
* @Annotation(["var1", "var2"], "var3")
* @Annotation\Filter\Name(["var1", "var2"], "var3", {"var4": "var5"})
* @Annotation(
* ["GET", "POST"]
) @Name({"name": "Tomas"})
* @Tag name name
*/
Expected result:
<?php
array(
[
'name' => 'Tag',
'value' => 'name name'
],
[
'name' => 'annotation',
'value' => 'bee'
],
[
'name' => 'aaf',
'value' => 'dsfsd fgdg'
]
// ... and so on... (see live example)
);
A live demo can be found here.