正则表达式多行修饰符m的问题

官方解释:
m ( PCRE_MULTILINE)
默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符 (^) 仅匹配字符串的开始位置, 而"行末"元字符 ($) 仅匹配字符串末尾, 或者最后的换行符(除非设置了 D 修饰符)。这个行为和 perl 相同。 当这个修饰符设置之后,"行首"和"行末"就会匹配目标字符串中任意换行符之前或之后,另外, 还分别匹配目标字符串的最开始和最末尾位置。这等同于 perl 的 /m 修饰符。如果目标字符串 中没有 "\n" 字符,或者模式中没有出现 ^ 或 $,设置这个修饰符不产生任何影响。
例1:
$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修饰符的作用被屏蔽了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值