示例文字: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;
答案 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
匹配行尾,而不是字符串尾)。