【问题标题】:Php annotation regexpphp注释正则表达式
【发布时间】:2014-01-29 23:31:48
【问题描述】:

我需要用正则表达式解析 php docComment 注释。可能的注释:

/**
 * @Annotation()
 * @Annotation\Name("var1", "var2")
 * @Annotation(["var1", "var2"], "var3")
 * @Annotation\Filter\Name(["var1", "var2"], "var3", {"var4": "var5"})
 */

基本上是@Annotation(<json>)。在php中我像这样解码它json_decode('['.$json.']')

现在我使用正则表达式/@(\w+[\\\\\w+]*)\(([^\)]*)?\)/,但这并不总是正确的。例如:

@Annotation("name()")

我应该使用什么正则表达式?

是否可以在一行中解析多个注释?

/**
 * @a() @b("var1")
 * ....
 */

更新:

如何在正则表达式中编写:

# match annotation name
# if brackets are empty 
    # match ()[space|newline]
# (else) if something is in brackets
    # match everything until:
        # ")[space|newline]
        # or })[space|newline]
        # or ])[space|newline]

更新 2

这个正则表达式@((\w+)([\\\\\w+]*))(?:\(\s*\)|\((.*?["\}\]])(?:\s|$)*\))(?:\s|$)怎么样。可以简化吗?

demo

【问题讨论】:

  • (?:@Annotation)([^(]+)*\((.+)(?=\)) 怎么样?例如,如果您想知道 \Name\Filter\Name,您可以使用 $2(第二个捕获组)访问 json,也可以选择使用 $1(第一个捕获组)。我认为不可能有像"name()" 这样的内容并且在一行上有两个注释。此 RegEx 适用于您的内容类型,但不适用于多行注释。

标签: php regex json


【解决方案1】:

修改为:

@([\\\w]+)\((.*)\)

Live demo #1

更新 3

一行注释更多:

@([\\\w]+)\((.*?)\)(?:\s|$)

Live demo #2

更新 4

根据您上次的编辑:

@([\\\w]+)\((?:|(.*?[]"}]))\)

Live demo #3

【讨论】:

  • @Annotation("name@name.com") 将失败
  • 是否可以匹配@Annotation("name()")@Annotation("name@name.com")
  • 感谢您的帮助。你的正则表达式几乎是我想要的,但@Annotation("name() ", "aaa") 会失败。查看我的问题更新:)
  • @Tomas 检查我的更新。你不是要记住更多的东西吗?! ;)
  • 感谢@revo 的时间和知识。你帮了我很多。
猜你喜欢
  • 2011-08-19
  • 2010-11-14
  • 2014-07-26
  • 2014-12-17
  • 2017-03-12
  • 2012-10-26
  • 2020-02-02
  • 1970-01-01
  • 2012-07-26
相关资源
最近更新 更多