当前位置: 首页 > 后端技术 > PHP

PHP正则表达式核心技术详解第11节贪心匹配与禁止贪心

时间:2023-03-29 23:00:00 PHP

作者:极客小军,专注网络技术的80后,不用和聪明人斗,只和那些懒惰的人斗,你一定会超越大多数人!?极客君?PHP正则表达式中的贪心匹配和(无贪心)贪心匹配什么是贪心匹配?废话不多说,先看一个代码示例如下:$string='aaaaaaabbbbbbbbbbbbbcccccccc';//如下$pattern='/ab+/';//或者如下$pattern='/ab.+/';preg_match($pattern,$string,$arr);show($arr);php正则表达式默认是贪心的。解决贪心匹配的方法是使用?;//如下$pattern='/ab+?/';//或者如下$pattern='/ab.+?/';preg_match($pattern,$string,$arr);show($arr);小案例1:这个跟加s是否被当成单行字符有关系,因为加s为单行字符后,会出现贪心匹配,所以在防止贪心之后,进行全局搜索匹配!代码如下:$string='testtesthttp://www.163.comtesttest百度testtesttest新浪';//匹配网址$pattern='/http:\/\/(ftp|www)\.\w+.(com|org|net)/';//这里没有匹配href的内容Adding?会导致贪心匹配$pattern='/href="(.+?)"/s';preg_match_all($pattern,$string,$arr);显示($arr);小案例2:删除某个class文件中的所有注释例如:car.class.php文件内容如下:run();//echo'
';//$Bz=newBz();//$Bz->run();?>然后处理Car.class.php中的注释,将里面的注释全部删除。通常我们是//加载文件如下$file='./Car.class.php';$content=file_get_contents($file);//正则匹配$pattern='/\/\*\*.*\*\//s';//替换为空$result=preg_replace($pattern,'',$content);//最后将处理后的字符重写到带文件中file_put_contents($file,$result);上面的处理好像没什么问题,但是当你打开Car.class.php这个文件的时候,你会大吃一惊!!现在Car.class.php中应该只有下面这个类了,其他的都没有了!!classBzimplementsCar{publicfunctionrun(){echo'Mercedes-Benzisrunning!!';}}==reason==:如果这样替换会产生如下情况:原因是;贪心匹配。匹配/从/开始到/结束,中间不管什么内容都算在范围之内!禁止贪婪的正确方法是添加?防止贪心匹配代码如下://loadfile$file='./Car.class.php';$content=file_get_contents($file);//正则匹配,禁止贪心$pattern='/\/\*\*.*?\*\//s';//替换为空$result=preg_replace($pattern,'',$content);//最后将处理后的字符重写到带文件中file_put_contents($file,$result);于是,Car.class.php文件中的注释全部被删除,Car.class.php文件中的代码如下:interfaceCar{functionrun();}classBmwimplementsCar{publicfunctionrun(){echo'宝马正在运行!!';}}classBzimplementsCar{publicfunctionrun(){echo'Mercedes-Benzisrunning!!';}}==Smallcase3==:找到出现1到5次的a,包括中间的那些。这个默认也是贪心的,因为它会取出匹配最大的那个!即5次以下代码:$string='cbaaaaaa';$pattern='/ba{1,5}/is';preg_match($pattern,$string,$arr);显示($arr);加?数字后可以防止贪心匹配,取出最小匹配次数如下:$string='cbaaaaaa';$pattern='/ba{1,5}?/is';preg_match($pattern,$字符串,$arr);show($arr);==Tips==:??两个问号表示完全取最小的?他们俩?marks表示禁止贪婪,取完整的最小值0,例如:一个在这种情况下?符号表示仍然采用一个a,但是两个??;$pattern='/ba??/is';preg_match($pattern,$string,$arr);show($arr);如果我的博客对你有帮助,请喜欢我的博客内容吗?”“点赞”“评论”“收藏”?一键三连!您的支持是我前进的动力。