基础 - 贪婪模式 ¶
作者:KK
发表日期:2017.7.9
要点速读 ¶
<div>.*?</div>
能匹配xxx <div>111</div>abc<div>222</div> xxx
里面的<div>111</div>
和<div>222</div>
这2个结果,这是非贪婪模式<div>.*</div>
能匹配xxx <div>111</div>abc<div>222</div> xxx
里面的<div>111</div>abc<div>222</div>
,这是贪婪模式贪婪模式下,表达式说的是从div开头到div结束,于是它就匹配到最后一个div结束为止(中间碰到了第一个结束的div都不会停止),够贪心的吧!
在匹配量修饰符后面加个问号就是非贪婪模式,前面讲过
*
表示0次或多次,+
表示1次或多次,?
表示0次或1次,{m,n}
表示m次到n次,{m,}
表示m次以上,这些匹配数量的修饰符后面再加一个?
号就是非贪婪模式
JS代码 ¶
//非贪婪+非全局匹配
console.log(
'xxx <div>111</div>abc<div>222</div> xxx'.match(/<div>.*?<\/div>/)
// <div>111</div>
);
//非贪婪+全局匹配
console.log(
'xxx <div>111</div>abc<div>222</div> xxx'.match(/<div>.*?<\/div>/g)
// <div>111</div> 和 <div>222</div> 因为g修饰符开启了全局匹配模式
);
//贪婪模式
console.log(
'xxx <div>111</div>abc<div>222</div> xxx'.match(/<div>.*<\/div>/)
// <div>111</div>abc<div>222</div>
);
PHP代码 ¶
header('Content-type:text/plain');
//非贪婪+非全局匹配
preg_match('#<div>.*?<\/div>#', 'xxx <div>111</div>abc<div>222</div> xxx', $matchResult1);
print_r($matchResult1); // <div>111</div>
//非贪婪+全局匹配
preg_match_all('#<div>.*?<\/div>#', 'xxx <div>111</div>abc<div>222</div> xxx', $matchResult2);
print_r($matchResult2); // <div>111</div> 和 <div>222</div>
//贪婪模式
preg_match_all('#<div>.*<\/div>#', 'xxx <div>111</div>abc<div>222</div> xxx', $matchResult3);
print_r($matchResult3); // <div>111</div>abc<div>222</div>