百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

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

wptr33 2025-05-02 13:48 4 浏览

作者:极客小俊

一个专注于web技术的80后

你不用拼过聪明人,你只需要拼过那些懒人 你就一定会超越大部分人!



PHP正则表达式中的贪婪匹配与 (禁止贪婪)


贪婪匹配

什么是贪婪匹配呢? 废话不多说 先看一段代码案例把 如下:

 $string='aaaaaaabbbbbbbbbbbbccccccc';
 //如下
 $pattern='/ab+/';
 //或者说是如下
 $pattern='/ab.+/';
 preg_match($pattern, $string,$arr);
 show($arr);

php正则表达式默认就是贪婪的 解决贪婪匹配 的办法就是用 ? 号 所以阻止贪婪一般加? 来解决 代码如下:

 $string='aaaaaaabbbbbbbbbbbbccccccc';
 //如下
 $pattern='/ab+?/';
 //或者说是如下
 $pattern='/ab.+?/';
 preg_match($pattern, $string,$arr);
 show($arr);

小案例1: 这里跟加不加s 视为单行字符有关系, 因为加了s 视为单行以后会产生贪婪匹配、所以阻止贪婪后 在进行全局搜索匹配! 代码如下:

 $string='test test http://www.163.com test test <a href="http://www.baidu.com">百度</a>
  test test test <a href="http://www.sina.com">新浪</a>';
 
 //匹配网址
 $pattern='/http:\/\/(ftp|www)\.\w+.(com|org|net)/';
 //匹配href的内容  这里不加? 就会出现贪婪匹配
 $pattern='/href="(.+?)"/s';
 
 preg_match_all($pattern, $string,$arr);
 show($arr);
 

小案例2: 删除某一个class文件中的所有注释 例如:Car.class.php文件 内容如下:

  <?php
 
 /**
  * @description
  * @author 3#
  */
 interface Car{
     function run();
 }
 
 
 /**
  * 
  * @description 宝马车类
  *
  */
 class Bmw implements Car{
     public function run(){
         echo '宝马车子在跑!!';
     }
 }
 
 
 /**
  * @description 奔驰车类
  *
  */
 class Bz implements Car{
     public function run(){
         echo '奔驰车子在跑!!';
     }
 }
 
 
 // $Bmw=new Bmw();
 // $Bmw->run();
 // echo '<br>';
 // $Bz=new Bz();
 // $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里面应该只剩下 下面这个类了 其他的都不见了!!

 class Bz implements Car{
     public function run(){
         echo '奔驰车子在跑!!';
     }
 }

原因:如果这样替换会产生如下情况: 原因是;贪婪匹配 .* 匹配了/* 开始一直到 /结尾、 中间无论什么内容都被视为 . 的范畴之内了!


禁止贪婪

正确的做法是加上? 号 阻止贪婪匹配 代码如下:

 //载入文件
 $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文件中的代码如下:

 interface Car{
     function run();
 }
 
 
 
 class Bmw implements Car{
     public function run(){
         echo '宝马车子在跑!!';
     }
 }
 
 
 
 class Bz implements Car{
     public function run(){
         echo '奔驰车子在跑!!';
     }
 }

小案例3: 查找a出现1次到5次, 也包含之间的, 这种默认也是贪婪的,因为它会取出最大匹配的那一次! 也就是5次 如下代码:

$string='cbaaaaaa';
$pattern='/ba{1,5}/is';
preg_match($pattern, $string,$arr);
show($arr);

加上 ? 号 以后 就可以阻止贪婪匹配 并且取出最小匹配次数 如下代码:

$string='cbaaaaaa';
$pattern='/ba{1,5}?/is';
preg_match($pattern, $string,$arr);
show($arr);

小提示: ??两个 问号就是完全取最小的 一个? 号表示取 0或者 1 两个?号就表示禁止贪婪 取完全最小值0, 例如:案例中一个?号表示还是取了1个a ,但是两个??问号就一定没有a了 因为两个?? 号表示0、等同于这样写: /ba{0}/ 代码如下:

$string='cbaaaaaa';
$pattern='/ba??/is';
preg_match($pattern, $string,$arr);
show($arr);



极客小俊@今日头条,首发原创文章

如果喜欢话请 "点赞 评论 收藏" 一键三连

大家的支持就是我坚持下去的动力!

相关推荐

如果手机显示无SIM卡,到底是什么意思呢?

一般手机显示无可用SIM卡,可能是如下原因造成的,大家可以了解下,并且进行解决。第一个,SIM卡未正确插入:我们需要检查SIM卡是否已正确插入手机。如果SIM卡没有完全插入,或者插反了,手机可能会显...

赶紧设置!工信部提醒设置手机SIM卡密码

【赶紧设置!工信部提醒设置手机SIM卡密码】平安法治2020近日,针对网友反映的手机失窃导致信息泄露事件,国家工信部立即组织核查处理,要求电信企业加强安全防护,并提醒手机用户设置SIM卡密码。...

手机突然显示无SIM卡?这样做就能恢复~

大家有没经历过明明SIM卡在卡槽里放得好好的,手机却突然显示无SIM卡的状况?没有了SIM卡手机就失去了灵魂,打电话、上网的功能都不能用了。这到底是怎么一回事儿?让小翼帮你来解答~什么是SIM卡?SI...

SK电讯首尔门店遭“围攻”,SIM卡更换服务陷混乱

据yna.co.kr网4月28日报道,28日,韩国SK电讯推出免费SIM卡更换服务以应对网络安全风险,首尔光化门店门前清晨8点便已排起长队。原定于上午10点开始的服务因企业员工需求激增,提前至9点启动...

Spring新闻汇总:Framework、Data、Security、Integration和Modulith发布里程碑版本

...

Springboot特性、快速创建SpringBoot应用、Starter简介

SpringBoot基础本章我们将揭开SpringBoot的神秘面纱。...

Springboot2的熔断、限流和降级讲解

高可用的三大利器是熔断、限流和降级。它们都是在分布式系统中用于保障系统稳定性和可用性的重要策略。熔断(CircuitBreaker):熔断是一种防止故障扩散的机制。当一个服务出现故障或超时,熔断器会...

Spring Cloud 全面解析:分布式系统开发的魔法工具包

SpringCloud全面解析:分布式系统开发的魔法工具包SpringCloud是Java开发者构建分布式系统的得力助手。它基于SpringBoot,为开发者提供了强大的微服务架构支持...

真香!GitHub开源SpringCloud Alibaba全解(全彩版)先到先得!

SpringCloudAliababa简介SpringCloudAlibaba是阿里巴巴集团开源的一套微服务架构解决方案。...

聊聊langchain4j-spring的1.0.0-beta版本的更新

序本文主要研究一下langchain4j-spring的1.0.0-beta版本的更新1.0.0-beta1...

Java异步编程(5种异步实现方式详解)

Java面试经常会问到:异步操作?什么是异步?与同步有什么区别?Java异步的是如何实现?有哪些异步实现方式?下面我一一来详解异步@mikechen什么是异步?...

全部开源的快速开发平台-开源字节

《硕宇精选》专注于探索、发现、分享开源技术应用和优质开源项目。本期推荐的优质项目是开源字节是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。该平台基于SpringBoot+MyBat...

Trip.com launches 700 products in 15 countries

OnlinetravelagencyTrip.comhasofferedmorethan700newoverseasproducts,visiting15countries...

Spring事务

使用Spring事务Spring事务介绍Spring事务的特点:1.多种事务API,Spring事务都可兼容;2.程序接入简单;3.与已有的Spring框架集成。...

牛刀小试——五分钟入门Spring Boot

万物皆可HelloWorld在一个程序员的眼里,万物皆可HelloWorld。SpringBoot当然也不例外。下面一起来完成我们的第一个SpringBoot程序。...