Regexp用于匹配PHPDoc中的所有@property

时间:2018-02-22 11:33:35

标签: php regex

我目前正在使用regexp来提取PHPDoc上面的所有@property内容。我没有在课堂上定义任何字段,因为我使用了魔法__get()方法。

我制作了(?<=@property)(.+(?=))((?<= ).+) regexp(Live example

但我不能在第一组周围切出空间,所以如果我有类似的东西:

* @property string external_order_id 

上面提到的正则表达式我会得到:

  • 完全匹配string external_order_id

  • 第1组string(注意单词周围的空格)

  • 第2组external_order_id(没有不必要的空格)

我尝试在第一组(?= )中使用(.+(?=)),但在该匹配后停止正则表达式。

你可以帮帮我吗?我会很感激。

2 个答案:

答案 0 :(得分:2)

由于.+捕获了@property子字符串后面出现的空格(向后(?<=@property)找到@property之后的位置,因此空白落在第1组中,并且.匹配任何字符,但换行符号。)

此外,(?=)是多余的,因为它需要在当前位置之后的空字符串,即“什么都不做”。

您可以使用

(?m)@property\h*\K(?:(\S+)\h+)?(\S+)$

请参阅regex demo

模式详情

  • (?m) - 一个多行修饰符,使$匹配一行而不是整个字符串
  • @property - 文字子字符串
  • \h* - 0+水平空格
  • \K - 一个匹配重置运算符,用于丢弃目前为止与Group 0缓冲区匹配的所有文本
  • (?: - 匹配一系列模式:
    • (\S+) - 第1组:一个或多个非空白字符
    • \h+ - 1+个水平空格
  • )? - 1或0次
  • (\S+) - 第2组:一个或多个非空白字符
  • $ - 行尾。

答案 1 :(得分:2)

由于可能存在没有类型的属性,您必须这样做:

(?m)@property *\K(?>(\S+) *)??(\S+)$
                            ^^
  • (?m)设置多行标记
  • (?>...)构建了一个原子组,用于非捕获目的。
  • ?? ungreedy可选量词(但您可以单独使用?
  • $断言行尾

Live demo

现在您熟悉行结束断言,您可以毫无后顾之忧地使用\s

(?m)@property\s*\K(?>(\S+)\s*)?(\S+)$