当前位置: 首页 > news >正文

正则表达式—贪婪与非贪婪模式

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

今天在进行一个网页数据的抓取过程中遇到了一点点的问题,要进行网页中图片的抓取,翻来覆去只能取到最后一张图片的地址,不能进行全部的匹配,后查资料得知正则中的表达式默认情况下是贪婪模式的,所以匹配到了最后一个符合条件的表达式,下面贴出小例子,只是便于大家理解


51 $str = '<td><img src="a.jpg"></td><td><img src="b.jpg"></td><td><img src="v.jpg"></td>';
 52 preg_match_all("/<img src=\"(.*)\">/is", $str, $outstr);
 53 print_r($outstr[1]);

这种情况匹配结果为:
Array
(
    [0] => a.jpg"></td><td><img src="b.jpg"></td><td><img src="v.jpg
)

也就是匹配到了最后的一个图片地址,因为正则表达式在默认情况下是贪婪的,所以匹配到了最后一个图片地址。

preg_match_all("/<img src=\"(.*?)\">/is", $str, $outstr);

将代码改为上面的形式,则可以匹配出想要的结果,


Array ( [0] => a.jpg [1] => b.jpg [2] => v.jpg )

? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。考虑这个表达式:a.*b,它将会匹配最长的以 a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:

a.*?b匹配最短的,以a开始,以b 结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)ab(第四到第五个字符)

转载于:https://my.oschina.net/yueguanqun/blog/66247

相关文章:

  • 05-maven学习-构建web项目
  • [更新]缓存管理的帮助类(MemoryCache版,需要.net 4以上)
  • CXF2.7.7 java.lang.RuntimeException: Cannot create a secure XMLInputFactory
  • C#对象克隆介绍 (转)
  • 使用tpcc-mysql进行性能测试
  • Struts action的单例与多例
  • windows下实现屏幕分享(C#)
  • Urxvt最简配置
  • 解决SecureCRT连接linux终端中文显示乱码
  • 无需重启,让组策略立即生效
  • 接触GitHub的第一次
  • android学习总结(20120721)
  • Java设计模式之依赖倒置原则
  • linux创建逻辑卷(lv)并挂载
  • C语言加密文本
  • angular2开源库收集
  • docker容器内的网络抓包
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • NSTimer学习笔记
  • React Transition Group -- Transition 组件
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Theano - 导数
  • yii2权限控制rbac之rule详细讲解
  • 前端
  • 手写双向链表LinkedList的几个常用功能
  • 微信小程序:实现悬浮返回和分享按钮
  • 新手搭建网站的主要流程
  • 一、python与pycharm的安装
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # Java NIO(一)FileChannel
  • #includecmath
  • #pragam once 和 #ifndef 预编译头
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (39)STM32——FLASH闪存
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)为C# Windows服务添加安装程序
  • ***原理与防范
  • .bashrc在哪里,alias妙用
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net 知识杂记
  • @Not - Empty-Null-Blank
  • [2023-年度总结]凡是过往,皆为序章
  • [Android] Amazon 的 android 音视频开发文档
  • [Angular] 笔记 20:NgContent
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BT]BUUCTF刷题第4天(3.22)
  • [C#]C#学习笔记-CIL和动态程序集
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [CTO札记]如何测试用户接受度?
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句