PCRE正则表达式匹配看起来像注释的字符串

时间:2012-07-24 22:14:08

标签: php regex

我正在尝试解析通过ReflectionClass :: getDocComment检索到的文档块中的自定义注释。我认为使用带有"/(@\w+)\s+([^@]+)/"标记的正则表达式PREG_SET_ORDER的preg_match_all可以做我想要的。我在一个交互式shell中测试它,它看起来很金。

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

我需要一些灵感!


更新

谢谢Arne,你的回答给了我一些想法,但我更喜欢一种只能适应当前特定问题的解决方案。

到目前为止,我已经提出了两种可能性。第一个只有当前有一个尾随空间才有效但我不确定我能保证总会有。第二个看起来无论如何都会起作用,但是更少......很好。

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

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

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

1 个答案:

答案 0 :(得分:2)

\ b作为单词边界不能在字符类中使用,因为\ b作为单词边界是一个模式,而不是一个字符。

我想你想匹配像

这样的东西
@import file @author firstname lastname <mail@address.com>

并且您对注释名称和参数感兴趣。

如果您只是将您的角色系列扩展为不包含<并为邮件地址附加可选模式,那么您最终可能会遇到以下情况:

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

我不知道这是否符合您感兴趣的所有注释,但可能是一个起点。