我确信这是微不足道的,但是我无法创建一个考虑到主题由多行组成的正则表达式。一个“m
”修饰符似乎不起作用。
答案 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开头和结尾。