PHP注释正则表达式

4

我需要用正则表达式解析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|$),它能被简化吗?

演示


1
那么 (?:@Annotation)([^(]+)*\((.+)(?=\)) 呢?你可以通过 $2 (第二个捕获组) 访问 json,并且如果你想知道 \Name\Filter\Name 之类的内容,则可以使用 $1(第一个捕获组)。但我认为,在一行上有像 "name()" 这样的内容并且有两个注释是不可能的。这个正则表达式适用于您的内容类型,但不适用于多行注释。 - tenub
1个回答

4
将其修改为:

进行修改:

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

演示1

更新3

如果一行中有多个注释:

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

演示 #2

更新 4

根据您最后的编辑:

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

Live demo #3


1
@Annotation("name@name.com") 将会失败。 - Tomas
能否匹配 @Annotation("name()")@Annotation("name@name.com") - Tomas
感谢您的帮助。您的正则表达式几乎是我想要的,但是@Annotation("name() ", "aaa")会失败。请查看我的问题更新 :) - Tomas
@Tomas,请检查我的更新。难道你不记得还有什么要补充的吗? ;) - revo
1
感谢 @revo 的时间和知识。你帮了我很多。 - Tomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接