2012-07-24 59 views
1

我想解析通过ReflectionClass :: getDocComment检索到的文档块的自定义注释。我认为使用preg_match_all与正则表达式"/(@\w+)\s+([^@]+)/"PREG_SET_ORDER标志将做我想要的。我在一个交互式shell中测试它,它看起来很棒。PCRE正则表达式看起来像一个注释的字符串

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

我需要一些灵感!


更新:

谢谢阿恩,你的回答给了我一些想法,但我更喜欢一个只在手适应于具体问题的通用解决方案。

到目前为止我已经提出了两种可能性。第一个只有当前存在尾部空间时才起作用,但我不确定总会有保证。第二个似乎工作,无论如何,但少得多......愉快。

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

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

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

回答

2

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

我猜你想匹配类似

@import file @author firstname lastname <[email protected]> 

和你感兴趣的注释名称和参数。

如果你简单地扩展你的性格的家人不包含<和追加的邮件地址的可选模式,你最终可能会是这样的:

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

我不知道这是否匹配所有关于你感兴趣的注释,但可能是它的起点。

+0

感谢您为什么'\ b'在字符类中不起作用的解释。同样在破译你的建议时,我学会了抑制一个我以前没有遇到的捕获,这真是太棒了=) – Matt 2012-07-26 03:44:55

相关问题