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

时间:2019-04-10 09:36:34

标签: php regex pcre regex-negation heredoc

示例文字:https://regex101.com/r/tfYEkO/1

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

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

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

所以我认为否定的提前解决可以解决问题,但这不符合任何要求:

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

我认为我不能在其中使用.*的否定式回溯。我尝试了不友好的标志,但是似乎并没有改变它。

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

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

It can contain multiple lines.
HTML;

1 个答案:

答案 0 :(得分:2)

您可以使用

terminate called after throwing an instance of std::bad_alloc

请参见regex demo

要使其符合PHP 7.3 more lax requirements(现在可以缩进结束标记,并且在除去结束标记后还需要换行),请使用

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

看到另一个regex demo

详细信息

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