官方解释:
-
m (
PCRE_MULTILINE)
- 默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。这个行为和 perl 相同。 当这个修饰符设置之后,"行首"和"行末"就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符串的最开始和最末尾位置。这等同于 perl 的 /m 修饰符。如果目标字符串 中没有 "\n" 字符,或者模式中没有出现 ^ 或 $,设置这个修饰符不产生任何影响。
$subject = "this is reg\n
reg
this is regexp tutor,oh reg";
if(preg_match_all('#.* reg$#mi', $subject, $matches)){
var_dump($matches);
}
输出:
array 0 => array 0 => string 'this is reg' (length=11) 1 => string 'this is regexp tutor,oh reg' (length=27)说明:
字符串里有\n符号,且/m修饰符只认\n,而不认实际其他看不见的换行符,所以在m修饰符的作用下可以匹配到两个
例2:
$subject = 'this is reg\n
reg
this is regexp tutor,oh reg';
if(preg_match_all('#.* reg$#mi', $subject, $matches)){
var_dump($matches);
}
输出:
array 0 => array 0 => string 'this is regexp tutor,oh reg' (length=27)说明:
虽然字符串里有\n符号,但是由于字符串换成了单引号控制,所以\n只是普通的两个字符;
例3:
$subject = "this is reg\n
reg
this is regexp tutor,oh reg";
if(preg_match_all('#.* reg$#mis', $subject, $matches)){
var_dump($matches);
}
输出:
array 0 => array 0 => string 'this is reg reg this is regexp tutor,oh reg' (length=47)说明:
由于加入了/s修饰符,'.'符号将可以匹配换行符,包括看不见的换行符,所以/m修饰符的作用被屏蔽了