匹配(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~'
为了使其符合 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
修饰符,$
匹配行尾,而不是字符串尾)。
示例文本位于: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~'
为了使其符合 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
修饰符,$
匹配行尾,而不是字符串尾)。