修正模式:
由于正则表达式匹配的目标字符串复杂多样,有些时候,同一个正则表达式匹配同一个字符串的时候存在匹配出两种或者是多种情况的可能,这就让匹配出现了歧义,修正模式就是为了解决这个问题而存在的。
下面我们来看两个比较重要的修正模式:
贪婪匹配:匹配结果存在歧义时取其长
在默认情况下,正则表达式采用的贪婪模式,也就是选用的最长的那个。
下面,我们来举个栗子:
<?php
$pattern = '/imooc.+123/';
$subject = 'I love imooc__123123123123123123';
//此时,__123可以作为.+的匹配结果,但是__123123也可以作为.+的匹配结果
//在默认情况下,采用的是贪婪模式,也就是选用最长的那个
$matches = array();
preg_match($pattern,$subject,$matches);
show($matches);
function show($var = null){
if(empty($var)){
echo 'null';
}
else if(is_array($var)||is_object($var)){
//array,object
echo '<pre>';
print_r($var);
echo '</pre>';
}
else{
//string ,int ,float...
echo $var;
}
}
?>
懒惰匹配:匹配结果存在歧义时取其短
如果要利用懒惰匹配,只需在正则表达式的结束符后面加上一个大写字母U即可。
<?php
$pattern = '/imooc.+123/U';
$subject = 'I love imooc__123123123123123123';
//此时,__123可以作为.+的匹配结果,但是__123123也可以作为.+的匹配结果
//在默认情况下,采用的是贪婪模式,也就是选用最长的那个
$matches = array();
preg_match($pattern,$subject,$matches);
show($matches);
function show($var = null){
if(empty($var)){
echo 'null';
}
else if(is_array($var)||is_object($var)){
//array,object
echo '<pre>';
print_r($var);
echo '</pre>';
}
else{
//string ,int ,float...
echo $var;
}
}
?>
常见的修正模式:
- U 懒惰匹配
- i 忽略英文字母大小写
- x 忽略空白
- s 让元字符' . ' 匹配包括换行符在内的所有字符
- e
我们还可以既使用懒惰匹配,又忽略大小写。例如:'/iLoveYOu/Ui'