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 永远不会匹配字符串内部的换行符。
模式修饰符
时间: 2024-10-28 20:14:10