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