PHP 的preg_replace匹配多行的正则表达式

2022-08-30 23:59:50

如何创建一个考虑到主题由多行组成的正则表达式?

一个的“”修饰符似乎不起作用。m


答案 1

Maxwell Troy Milton King是对的,但由于他的答案有点短,我也会发布这个并提供一些例子来说明。

首先,默认情况下,元字符与换行符不匹配。对于许多正则表达式实现都是如此,包括PHP的风格。也就是说,以文本为例:.

$text = "Line 1\nLine 2\nLine 3";

和正则表达式

'/.*/'

则正则表达式将仅匹配 。亲眼看看:Line 1

preg_match('/.*/', $text, $match);
echo $match[0]; // echos: 'Line 1'

因为“停止匹配”在(新行字符)。如果还想让它与换行符匹配,请在正则表达式的末尾附加 s 修饰符(也称为 DOT-ALL 修饰符):.*\n

preg_match('/.*/s', $text, $match);
echo $match[0]; // echos: 'Line 1\nLine 2\nLine 3'

现在关于 m 修饰符(多行):这将使匹配不仅成为输入字符串的开头,还允许匹配每行的开头。与 :相同,它不仅会让匹配输入字符串的结尾,还会让每行的结尾。^$$

例如:

$text = "Line 1\nLine 2\nLine 3";
preg_match_all('/[0-9]$/', $text, $matches);
print_r($matches); 

这将仅匹配3(在输入的末尾)。但:

但启用 m 修饰符:

$text = "Line 1\nLine 2\nLine 3";
preg_match_all('/[0-9]$/m', $text, $matches);
print_r($matches);

每行末尾的所有(单个)数字(“1”,“2”和“3”)都匹配。


答案 2

尝试使用“s”修饰符。意思是“像对待一行一样对待”。

“m”允许使用 ^ 和 $ 行的开头和结尾。


推荐