我正在尝试解析通过ReflectionClass :: getDocComment检索到的文档块中的自定义注释。我认为使用带有"/(@\w+)\s+([^@]+)/"
标记的正则表达式PREG_SET_ORDER
的preg_match_all可以做我想要的。我在一个交互式shell中测试它,它看起来很金。
我没想到要测试的是来自phpdoc的@author
标签。作者标签的可选电子邮件地址(显然)中包含@
。我不能在正则表达式的字符类中使用\b
来要求@
位于单词的开头,因为它不会被解释为单词边界字符而是退格。
我需要一些灵感!
更新
谢谢Arne,你的回答给了我一些想法,但我更喜欢一种只能适应当前特定问题的解决方案。
到目前为止,我已经提出了两种可能性。第一个只有当前有一个尾随空间才有效但我不确定我能保证总会有。第二个看起来无论如何都会起作用,但是更少......很好。
第一个正则表达式是"/(@\w+)\s+((?:[^@]\S*?\s+)*)/"
第二个正则表达式是"/(@\w+)\s+((?:[^@]\S*?(?:\s|$)+)*)/"
也许有人可以帮我清理第二个。
答案 0 :(得分:2)
\ b作为单词边界不能在字符类中使用,因为\ b作为单词边界是一个模式,而不是一个字符。
我想你想匹配像
这样的东西@import file @author firstname lastname <mail@address.com>
并且您对注释名称和参数感兴趣。
如果您只是将您的角色系列扩展为不包含<
并为邮件地址附加可选模式,那么您最终可能会遇到以下情况:
(@\w+)\s+([^<@]+(?:<[^>]+>)?)
我不知道这是否符合您感兴趣的所有注释,但可能是一个起点。