【www.gdgbn.com--正则表达式】
昨天碰到的问题,在BBs问了得出的答应如下./(.+?)b/is 是非贪婪模式 匹配ab /(.*)b/is 是贪婪模式 匹配abb,
那么我们来看看基本的符号说明:
* 0次、1次或多次匹配其前的原子
+ 1次或多次匹配其前的原子
? 0次或1次匹配其前的原子
. 匹配除换行之外的任何一个字符
再看看简单的例子:
你测试.+?和.*当然看不出区别了
测试这个字符串看看
"aaa123456bbb"
<.+?>会匹配和
<.*>会匹配123456
最后看看高手怎么说的.
(.+)默认这是贪婪匹配
贪婪是先看整个字符串是否匹配, 如果不匹配,它会去掉字符串的最后一个字符, 并再次尝式, 如果还不匹配, 那么再去掉当前最后一个, 直到发现匹配或不剩任何字符.
过程大概这样:
$str="abcdabceba"
/.+b/ // 匹配一个或多个任意字符后面跟一个字母 b
第一次(先看整个字符串是否是一个匹配) abcdabceba 不匹配,然后去掉最后一个字符 a
第二次(去掉最后一个字符后再匹配) abcdabceb 正确退出
惰性是从左侧第一个字符开始向右匹配, 先看第一个字符是不是一个匹配, 如果不匹配就加入下一个字符再尝式匹配, 直到发现匹配...
过程大概这样
$str="abcdabceba"
/.+?b/ // 同样匹配一个或多个任意字符后面跟一个字母 b
第一次(读入左侧第一个字符) a 不匹配加一个再式
第二次 ab 匹配记录下来,继续(如果匹配所有的话,比如 preg_match_all, 或preg_replace, 不是所有到这儿就停了
第三次 c
...
cdab 匹配记录下来,继续
...
ceb 匹配记录下来,继续
a 到最后了没有了退出
简单例子:
//这里因为没有用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
?>