1

我正在尝试从通过 ReflectionClass::getDocComment 检索到的文档块中解析自定义注释。我想将 preg_match_all 与"/(@\w+)\s+([^@]+)/"带有PREG_SET_ORDER标志的正则表达式一起使用会做我想要的。我在交互式外壳中对其进行了测试,它看起来很金黄。

我没想到要测试的是@author来自 phpdoc 的标签。作者标签的可选电子邮件地址(显然)有一个@。我不能\b在正则表达式的字符类中使用要求@be 在单词的开头,因为它不会被解释为单词边界字符而是退格。

我需要一些灵感!


更新:

谢谢 Arne,您的回答给了我一些想法,但我更喜欢通用解决方案,而不是仅适用于手头特定问题的解决方案。

到目前为止,我提出了两种可能性。第一个仅在当前存在尾随空格时才有效,但我不确定我能否保证总会有。第二个似乎无论如何都可以工作,但要少得多……精巧。

第一个正则表达式是"/(@\w+)\s+((?:[^@]\S*?\s+)*)/"

第二个正则表达式是"/(@\w+)\s+((?:[^@]\S*?(?:\s|$)+)*)/"

也许有人可以帮我清理第二个。

4

1 回答 1

2

\b as word boundary can't be used inside a character class, because \b as word boundary is a pattern, not a character.

I guess you want to match something like

@import file @author firstname lastname <mail@address.com>

and your interested in the annotations name and parameter.

If you simply extend your character family to not contain the < and append an optional pattern for the mail address, you may end up with something like this:

(@\w+)\s+([^<@]+(?:<[^>]+>)?)

I don't know if this matches all annotations of your interest, but may be it's a starting point.

于 2012-07-24T22:44:03.270 回答