php preg_replace正则表达式匹配多行

时间:2010-02-10 21:07:14

标签: php regex

我确信这是微不足道的,但是我无法创建一个考虑到主题由多行组成的正则表达式。一个“m”修饰符似乎不起作用。

2 个答案:

答案 0 :(得分:47)

麦克斯韦特洛伊米尔顿金是对的,但由于答案有点短,我也会发布这个并提供一些例子来说明。

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

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

和正则表达式

'/.*/'

然后正则表达式只匹配Line 1。亲眼看看:

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

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

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')匹配。

答案 1 :(得分:8)

你试过's'修饰符吗?意思是“好像是单行。 'm'允许使用^和$ line开头和结尾。