匹配(1 个或多个)php 包含空行的 heredocs 的正则表达式

Regex to match (1 or more) php heredocs containing an empty line

示例文本位于:https://regex101.com/r/tfYEkO/1

我想在 php 代码中找到包含空行的文档。

我可以使用这个正则表达式来做到这一点,但是如果一个文件中有 2 个 heredoc,它会从第一个开始到第二个结束进行匹配:

<<<([A-Z]+)\n.*\n\n.*\n *\b

所以我认为负前瞻会解决它,但这与任何东西都不匹配:

<<<([A-Z]+)\n(?!.*.*).*\n\n(?!.*.*).*\n *\b

我不认为我可以使用带有 .* 的负面回顾。我尝试了 ungreedy 标志,但这似乎并没有改变它。

仅供参考,php 中的一个 heredoc 以 <<< 和一个关键字开头,并在其自己的行中以该关键字结尾:

$foo = <<<HTML
This is the string that is returned.

It can contain multiple lines.
HTML;

您可以使用

'~<<<([A-Za-z_]\w*)(?:\R(?!;\R).*)*\R(?:\R(?!;\R).*)*\R;\R~'

regex demo

为了使其符合 PHP 7.3 more lax requirements(关闭标记现在可以缩进和移除关闭标记后的新行要求),使用

'~<<<([A-Za-z_]\w*)(?:\R(?!\h*;$).*)*\R(?:\R(?!\h*;$).*)*\R\h*;$~m'

再看一个regex demo

详情

  • <<< - 文字 <<< 子串
  • ([A-Za-z_]\w*) - 第 1 组:有效的 PHP 标签( 必须仅包含字母数字字符和下划线,并且必须以非数字字符或下划线开头)
  • (?:\R(?!;\R).*)* - 0 次或多次重复的换行符 (\R) 后跟的值与第 1 组中的值不同,后跟 ; 和换行符,然后整行 (.*)
  • \R - 一个换行符
  • (?:\R(?!;\R).*)* - 见上文(注意在 (?!\h*;$) 的情况下,它意味着 "not followed with 0+ horizontal whitespaces, Group 1 value and ; at the end of the line"
  • \R - 一个换行符
  • </code> - 与第 1 组相同的值</li> <li><code>; - 一个分号
  • \R - 换行符/$ - 行尾(使用 m 修饰符,$ 匹配行尾,而不是字符串尾)。