7.4 正则达达示中的模式修正符
最后更新于:2022-04-02 00:20:28
我们通过元字符和原子完成了正则表达式的入门。但有一些特殊情况我们依然需要来处理。
如果abc在第二行的开始处如何匹配?
我不希望正则表达示特别贪婪的匹配全部,只匹配一部分怎么办?
这个时候,我们就需要用到下面的这些模式匹配来增强正则的功能。
常用的模式匹配符有:
| 模式匹配符 | 功能 |
| -- | -- |
| i | 模式中的字符将同时匹配大小写字母. |
| m | 字符串视为多行 |
| s | 将字符串视为单行,换行符作为普通字符. |
| x | 将模式中的空白忽略. |
| A | 强制仅从目标字符串的开头开始匹配. |
| D | 模式中的美元元字符仅匹配目标字符串的结尾. |
| U | 匹配最近的字符串. |
模式匹配符的用法如下:
> / 正则表达示/模式匹配符
模式匹配符是放在这句话的最后的。例如:
> /\w+/s
格式我们清楚了,接下来最主要的是加强对于模式匹配符使用的理解和记忆。我们通过代码来理解加上和不加模式匹配符有何区别。
###i 不区分大小写
~~~
~~~
结论,不论是$string还是$string1全都匹配成功了。因此,在后面加上了i之后,在匹配的时候可以不区分大小写。
### m 视为多行
正则在匹配的时候,要匹配的目标字符串我们通常视为一行。
“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束。
当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。
**注意:如果要匹配的字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。**
我们通过实验和代码来验证一下这个特点:
第一次匹配,你会发现匹配不成功:
~~~
~~~
第二次,在正则表达示后面加上模式匹配符s:
~~~
~~~
结果如下,匹配成功!
![document/2015-09-04/55e9622e85495](http://box.kancloud.cn/document_2015-09-04_55e9622e85495.png)
**结论:**
1. 因为在新的未来,未来后面有一个换行
2. 而.(点)是匹配非空白字符以外的所有字符。因此,第一次不成功
3. 第二次,加上了s模式匹配符。因为,加上后.(点)能匹配所有字符。
###x 忽略空白字符
1. 如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。
2. 未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。
我们先来实验一下忽略空白行等特性:
~~~
~~~
这样也能匹配成功。
![document/2015-09-04/55e9644052bd6](http://box.kancloud.cn/document_2015-09-04_55e9644052bd6.png)
在$pattern里面有空格,每个abc后面有一个空格。而$string里面没有空格。
所以x忽略空白字符。
而第二句话从字面上比较难理解,
~~~
~~~
结果也匹配成功了!
![document/2015-09-04/55e9644052bd6](http://box.kancloud.cn/document_2015-09-04_55e9644052bd6.png)
我们发现,x的第二个特性是忽略:#字符和下一个换行符之间的字符也被忽略。
###e 将匹配项找出来,进行替换
* e模式也叫逆向引用。主要的功能是将正则表达式括号里的内容取出来,放到替换项里面替换原字符串。
* 使用这个模式匹配符前必须要使用到preg_replace()。
> mixed preg_replace ( mixed $正则匹配项 , mixed $替换项 , mixed $查找字符串)
* preg_replace的功能:使用$正则匹配项变,找到$查找字符串变量。然后用$替换项变量进行替换。
在正式讲解前我们回顾一下之前的知识,我们故意把每个要匹配的原子外面都加上括号:
~~~
~~~
我们来看看结果:
![document/2015-09-05/55ea63c27b9e2](http://box.kancloud.cn/document_2015-09-05_55ea63c27b9e2.png)
这是我们之前讲括号的时候:匹配到的内容外面有括号。会把括号里面的内容,也放到数组的元素里面。如图中的:987、abc、321。
我们接下来看正则表达示中的e模式:
~~~
~~~
我们看看执行结果:
![document/2015-09-05/55ea647e995b4](http://box.kancloud.cn/document_2015-09-05_55ea647e995b4.png)
结论:
1. 上例中\$2 指向的是正则表达示的第一个(\d+)。相当于把15又取出来了
2. 替换的时候,我写上\$2。将匹配项取出来,用来再次替换匹配的结果。
###U 贪婪模式控制
正则表达式默认是贪婪的,也就是尽可能的最大限度匹配。
我们来看看正则表达示是如何贪婪的:
~~~
.*<\/div>/';
$string = "
';
你好
我是
";
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
} else {
echo '没有匹配到';
}
?>
~~~
我们来看看结果,得到如下结论。它从“你好”直接匹配到了“我是
”。进行了最大范围的匹配。
![document/2015-09-05/55ea7253227a5](http://box.kancloud.cn/document_2015-09-05_55ea7253227a5.png)
同样一段代码我们再加大写的U,再看看效果:
~~~
.*<\/div>/U';
$string = "你好
我是
";
if (preg_match($pattern, $string, $match)) {
echo '匹配到了,结果为:';
var_dump($match);
} else {
echo '没有匹配到';
}
?>
~~~
![document/2015-09-05/55ea72bc445e6](http://box.kancloud.cn/document_2015-09-05_55ea72bc445e6.png)
我们发现,只匹配出来了:
~~~
你好
~~~
这样,把正则的贪婪特性取消掉。让它找到了最近的匹配,就OK了。
###A 从目标字符串的开头开始匹配
此模式类似于元字符中的^(抑扬符)效果。
~~~
~~~
结论:
1. 如果加A模式修正符的时候匹配不出来$string,不加时能匹配出来
2. 如果加上了A模式修正符的时候能匹配出来$string1,因为必须要从开始处开始匹配
### D 结束$符后不准有回车
如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。
~~~
~~~
结果展示:
![document/2015-09-05/55ea790f3df3f](http://box.kancloud.cn/document_2015-09-05_55ea790f3df3f.png)
结论:
1. 如pattern 在匹配$string的时候,$string的字符串this后有一个回车。在没有加D匹配符的时候也能匹配成功
2. 如pattern 在匹配$string的时候,加上了D。$string的字符串this后有空格,匹配不成功。