模式修饰符

s: 点号通配模式


文本文件string

i'm liuyibao.
i'm 25.


PHP代码

$str = file_get_contents('./string');echo $str;
if(preg_match('/.*/s', $str, $matches)){
    print_r($matches);
}

运行结果

i'm liuyibao. i'm 25.
Array ( [0] => i'm liuyibao. i'm 25. ) 

由此可以看出点号通配模式可以匹配换行符。


假如PHP代码是这样的,即去掉模式修饰符s

$str = file_get_contents('./string');echo $str;
if(preg_match('/.*/', $str, $matches)){
    print_r($matches);
}

运行结果如下,即不能匹配换行符及之后的字符串

i'm liuyibao. i'm 25.
Array ( [0] => i'm liuyibao. ) 

转自 ‘精通正则表达式P119’: 如果所使用的工具能够在多行文本中进行搜索,请务必注意点号,它在通常情况下不能匹配换行符. P111有详细点号通配模式的介绍


m : 增强的行锚点模式


文本文件string同上,PHP代码如下:

$str = file_get_contents('./string');
echo $str.'<br/>';
$str2 = preg_replace('/^/', '###', $str);
echo $str2;

运行结果如下:

i'm liuyibao. i'm 25.
###i'm liuyibao. i'm 25.

可见只有行首的起始被替换为###


PHP代码改成增强的行锚点模式,如下

$str = file_get_contents('./string');
echo $str.'<br/>';
$str2 = preg_replace('/^/m', '###', $str);
echo $str2;

运行结果如下:

i'm liuyibao. i'm 25.
###i'm liuyibao. ###i'm 25.

可见文本内所有的行起始位置都被替换为###


下面将string改为如下,即增加了一个空行:

i'm liuyibao.

i'm 25.

PHP代码改为如下,即将空行替换为###:

$str = file_get_contents('./string');
echo $str.'<br/>';
$str2 = preg_replace('/^$/', '###', $str);
echo $str2;

运行结果如下,即没能替换:

i'm liuyibao. i'm 25.
i'm liuyibao. i'm 25.

改为增强模式:

$str = file_get_contents('./string');
echo $str.'<br/>';
$str2 = preg_replace('/^$/m', '###', $str);
echo $str2;

运行结果如下,成功替换:

i'm liuyibao. i'm 25.
i'm liuyibao. ### i'm 25.

转自: '精通正则表达式' P112,通常情况下,锚点^不能匹配字符串内部的换行符,而只能匹配目标字符串的起始位置。但是在增强模式下,它能够匹配字符串内嵌的文本行的开头位置,$也是如此

支持此模式的程序通常还提供了 \A 和 \Z , 它们的作用与普通的 ^ 和 $ 一样,只是在此模式下它们的意义不会发生变化。也就是说 \A 和 \Z 永远不会匹配字符串内部的换行符。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值