首页->正文

正则修饰符m和s用法

2011-04-26 -Web开发 标签: php

以下摘自php手册(RTFM
m (PCRE_MULTILINE)
默认情况下, PCRE认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行), "行首"元字符(^)仅匹配字符串的开始位置, 而"行末"元字符($)仅匹配字符串末尾, 或者最后的换行符(除非设置了D修饰符). 这个行为和perl相同. 当这个修饰符设置之后, "行首"和"行末"就会匹配目标字符串中任意换行符之前或之后, 另外, 还分别匹配目标字符串的最开始和最末尾位置. 这等同于perl的/m修饰符. 如果目标字符串 中没有"\n"字符, 或者模式中没有出现^或$, 设置这个修饰符不产生任何影响.
s (PCRE_DOTALL)
如果设置了这个修饰符, 模式中的点号元字符匹配所有字符, 包含换行符. 如果没有这个 修饰符, 点号不匹配换行符. 这个修饰符等同于perl中的/s修饰符. 一个取反字符类比如 [^a]总是匹配换行符, 而不依赖于这个修饰符的设置.

还不明白?举例就看明白了!
以preg_match_all为例,从字符串s中匹配出所有url
<?php
$s = '<a href="/1.html">
1</a>
<a href="/2.html">2</a>
';
preg_match_all('{<a href="([^"]*)">.*?</a>}s', $s, $m);
print_r($m);
/*
Array
(
    [0] => Array
        (
            [0] => <a href="/1.html">
1</a>
            [1] => <a href="/2.html">2</a>
        )

    [1] => Array
        (
            [0] => /1.html
            [1] => /2.html
        )
)
*/

也就是说s标记可以让 . 匹配换行符,这样就能方便匹配出字符串中发生换行的url链接了。

再看下m的用法,从字符串中匹配出abc开头的所有行
<?php
$s = '
abc
abce
defabc
ghkabc
abcf
';
preg_match_all('{^abc.*}m', $s, $m);
print_r($m);
/*
Array
(
    [0] => Array
        (
            [0] => abc
            [1] => abce
            [2] => abcf
        )
)
*/

可以看到m标记相当于把字符串按行分割,然后再进行匹配。
还有要注意的是如果匹配以某模式结尾,例如匹配以c结尾的所有行,注意$前面的.要加上,以匹配每行的换行符
preg_match_all('{.*c.$}m', $s, $m);
print_r($m);
/*
Array
(
    [0] => Array
        (
            [0] => abc
            [1] => defabc
            [2] => ghkabc
        )

)
*/

更多修饰符用法参见
http://cn.php.net/manual/zh/reference.pcre.pattern.modifiers.php

下一篇 用js统一给链接加属性

上一篇 用xhprof分析php代码

相关文章

Ubuntu下编译安装PHP

使用curl_multi_init并发请求

php增加Last-Modified为何无效

用xhprof分析php代码

用php解析配置文件

文章分类

开发小提示

  • 1:Mongodb中通过db.yourCollectionName. dataSize()查看某个文档的大小
  • 2:linux下用reset命令恢复查看二进制文件导致的命令行乱码
  • 3:查看MySQL表的索引情况show index from tableName
  • 更多...

交流

  • wangnow(a)126.com