正则表达式(.+?)与(.+)区别
(.+) 代表的是贪婪,匹配从右到左。
(.+?)代表的是⾮贪婪,匹配从左到右。
昨天碰到的问题,在BBs问了得出的答应如下./(.+?)b/is  是⾮贪婪模式匹配ab /(.*)b/is 是贪婪模式匹配abb,
那么我们来看看基本的符号说明:
*                                0次、1次或多次匹配其前的原⼦
+                                1次或多次匹配其前的原⼦
0次或1次匹配其前的原⼦
.                                匹配除换⾏之外的任何⼀个字符
再看看简单的例⼦:
你测试.+?和.*当然看不出区别了
测试这个字符串看看
'aaa<div >123456</div>bbb'
<.+?>会匹配<div >和</div>
<.*>会匹配<div >123456</div>
最后看看⾼⼿怎么说的.
(.+)默认这是贪婪匹配
贪婪是先看整个字符串是否匹配, 如果不匹配,它会去掉字符串的最后⼀个字符, 并再次尝式, 如果还不匹配, 那么再去掉当前最后⼀个, 直到发现匹配或不剩任何字符.
过程⼤概这样:
$str='abcdabceba'
/.+b/  // 匹配⼀个或多个任意字符后⾯跟⼀个字母 b
第⼀次(先看整个字符串是否是⼀个匹配) abcdabceba 不匹配,然后去掉最后⼀个字符 a
第⼆次(去掉最后⼀个字符后再匹配) abcdabceb  正确退出
惰性是从左侧第⼀个字符开始向右匹配, 先看第⼀个字符是不是⼀个匹配, 如果不匹配就加⼊下⼀个字符再尝式匹配, 直到发现匹配...
过程⼤概这样
$str='abcdabceba'
/.+?b/ // 同样匹配⼀个或多个任意字符后⾯跟⼀个字母 b
第⼀次(读⼊左侧第⼀个字符) a 不匹配加⼀个再式
第⼆次 ab  匹配记录下来,继续(如果匹配所有的话,⽐如 preg_match_all, 或preg_replace, 不是所有到这⼉就停了
第三次 c
...
cdab  匹配记录下来,继续
...
ceb  匹配记录下来,继续
a 到最后了没有了退出
简单例⼦:
<?php
//这⾥因为没有⽤all, .+?只匹配⼀次
正则表达式任意内容
$str='abcdabceba';
preg_match('/.+b/', $str, $s);
echo $s[0]; // abcdabceb
echo"  ";
preg_Match('/.+?b/', $str, $s);
echo $s[0]; // ab
echo"  ";
preg_Match('/.+b/U', $str, $s); //等同于 /.+?b/
echo $s[0]; //ab
>