比如这段html,最终结果只需要两个图片:
老...<p class="reslinkinfo">新浪文娱</p>李冰冰承认李雪是mm 李冰冰真实年龄42?(图)_文娱_腾讯网<img src="https://p.ssl.qhimg.com/dmsmfl/120_75_/t013e8ac02be9c39957.jpg?size=246x379&phash=3264502081370932440" ><br><br>毕竟,当对李雪满怀感激打动之心的李冰冰看到她穿上婚纱,一步步走向幸福那刻,情难自禁,兴奋暗示:“作为姐姐,我毕竟可以欣慰啦。”而后,她更略有歉...<p class="reslinkinfo">腾讯文娱</p>李冰冰mm李雪照片曝光 两人像极双胞胎(组图)搜狐青岛<img src="https://p.ssl.qhimg.com/dmsmfl/120_75_/t01641ca782482f584f.jpg?size=500x333&phash=6529213026346063041" ><br><br>恰逢父亲节
试过.*?(?=<img[^>]*>)
会把前面的一个img里的内容也取到.
因为你没有指定语言, 我就用最擅长的
Ruby
吧. 通常, 遵循Perl
风格的正则都应该可以执行.说明:
\s+
表示匹配一个或多个空格, 因为img
和src
之间至少一个空格()
表示组, 可以反向引用, 参见我的另一个回答.*?
表示懒惰匹配, 找最近的以下一个字符结尾的, 相当于[^"]*
和[^>]*
说明:
(?<=)
表示前导串匹配, 即作为匹配串的前导字串, 但并不包含在匹配中(?=)
表示位置串匹配, 即此处应该匹配此字串, 但并不包含在匹配中常用上面两个来定位想要字串的前后字串, 但又不想包括前后字串
两个方案有些许区别, 方案一, 实际上整个
<img ...>
标签都会被匹配, 但是可以反向引用匹配组()
. 在Ruby
中, 传递给块参数的是匹配组, 因此可以使用, 别的语言应该有相似的机制. 方案二, 实际上只匹配标签的src
属性的值, 即你想要的图片.但方案二有个问题, 前导串匹配要求长度固定. 也就是说, 当
img
和src
有不确定长度的空白时, 并不能写作(?<=<img\s+src=")
. 前导串匹配的匹配是<img\s+src="
, 其长度不固定, 所以不能写成这样.因为推荐方案一, 且大部分语言的正则都支持反向引用, 而前导串和位置串匹配并不一定支持, 这算非常高级的内容.
?<=
术语zero-width positive lookbehind
, 前导串匹配是我自己生造的, 虽然我觉得更贴切?=
术语zero-width positive lookhead
, 同上.也有翻译为
零宽度位置匹配
.