php正则表达式中常用的模式修正符

模式修正符是用来扩展正则匹配的, 意思是可以开辟更多的匹配空间或者是修正一些匹配模式,在有的语言中的正则没有这个模式修正符,因为我最近正在学习php,所以本篇说的就是php中的环境。前面我们知道了,模式修正符是被用来修饰正则匹配模式的,也可以说扩展正则匹配,它是被用到定界符之外的,如果不和正则配合使用,就是普通的字母。 那就来看几个常见的模式修正符。

1. i 匹配大小写(不区分大小写)

比如我们要匹配一段话, 这段话里既有小写, 又有大写, 而我们模式里匹配的只有小写, 就可以通过加模式修正符i的方式让他同时匹配大小写。

<?php
/*

不区分大小写匹配

*/
$p = "/imfinal/i";
$s = "thisisAImFinAltesta";
$result = preg_match($p,$s,$arr);
print_r($arr);

当然, 在不存在模式修正符的语言里, 我们还可以这样

<?php
/*

不区分大小写匹配

*/
$p = "/im\wfinal/";
$s = "thisisAImFinAltesta";
$result = preg_match($p,$s,$arr);
print_r($arr);

一样是匹配的到的

2. m 匹配多行 (把一行的每个段落都当作一个新行)

<?php
/*

把每一个段落当成一行匹配

*/
$p = "/^abc/im";
$s = "dfssadg
dsafa
QWW
WDWQFD
abw
addf
abc
www
Abc
";
$result = preg_match_all($p,$s,$arr);
print_r($arr);

匹配abc开头, 因为使用了i和m修饰, 就会忽略大小写和把每一一个换行都当成一个新行匹配,因为用了all, 所以会匹配出所有解决, abc Abc。

3. s 匹配单行, 把所有的段落当成一个匹配, 如果存在.就匹配换行符

<?php
/*

把所有段落当成一行匹配,如果这个时候模式里用了.就会重新匹配换行符,因为修正符里使用了s已经把字符串修正成了一行。

*/
$p = "/^ab.+c/is";
$s = "abcdfssadg
dsafa
QWW
WDWQFD
abw
addf
abc
www
Abc
";
$result = preg_match_all($p,$s,$arr);
print_r($arr);

4. A 匹配必须以什么开头(和^同义)

<?php

$p = "/abc/imA";
$s = "abcalsdfkjadf
abc
Abcdfegfwr
aaaaafd
aBc
dsccdvc
aaaabc";
if(preg_match_all($p,$s,$arr))
{
    print_r($arr);
}

i不区分大小写, m把每一个段落都当成一个新行匹配, A表示必须以abc开头, 要注意的是,这里只会匹配第一行,因为强制要求了abc开头, 所以这里实际上又把它当成了一行。

5. x 忽略正则匹配模式中的空格

<?php

$p = "/a b c/imx";
$s = "aaaddfsdgfthisisaabcsfdf";
if(preg_match_all($p,$s,$arr))
{
    print_r($arr);
}

6. e 只能在preg_replace中使用, 该函数原型

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

增加e修饰符会导致replacement被以php代码形式执行,因为这个造成了很多安全上的问题, 新版本的php中已被官方废弃。 举个例子, 比如:

<?php

$string = 'This is a test';
$pattern = '/\w+\s+(\w+)\s\w+\s\w+/ie';
$replacement = $_GET["s"];
echo preg_replace($pattern, $replacement, $string);

给get参数提供一个参数phpinfo()将会导致一个代码执行漏洞。 preg_replace函数的意思是, 进行一个正则替换, 如果匹配到了string, 就执行替换replacement里的内容。

参考 http://php.net/manual/zh/function.preg-replace.php

此条目发表在正则分类目录,贴了, , 标签。将固定链接加入收藏夹。