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



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

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

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

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

所以我认为消极的展望可以解决这个问题,但这与任何事情都不匹配:

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

我不认为我可以在其中使用负面的.*回头。我尝试了不贪婪的标志,但这似乎并没有改变它。

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

$foo = <<<HTML
This is the string that is returned.
It can contain multiple lines.
HTML;

您可以使用

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

查看正则表达式演示

要使其符合 PHP 7.3 更宽松的要求(现在可以缩进结束标记,并且删除关闭标记后的新行要求),请使用

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

查看另一个正则表达式演示。

  • <<<- 文字<<<子字符串
  • ([A-Za-z_]w*)- 组 1:有效的 PHP 标签(必须仅包含字母数字字符和下划线,并且必须以非数字字符或下划线开头)
  • (?:R(?!1;R).*)*- 0 次或多次重复换行符 (R) 后跟的值与
  • 组 1 中的值不同,后跟;和换行符,然后是整行 (.*)
  • R- 换行符
  • (?:R(?!1;R).*)*- 见上文(请注意,在(?!h*1;$)的情况下,它表示"不跟着 0+ 水平空格、组 1 值和行尾的;">
  • R- 换行符
  • 1- 与组 1 中的值相同
  • ;- 分号
  • R- 换行符
  • /$- 行尾(使用m修饰符,$匹配行尾,而不是字符串尾)。

相关内容

  • 没有找到相关文章

最新更新