我需要一个正则表达式来搜索某些HTML并查找具有此属性的所有<img>
标记:class="lazy"
而不是那个:data-original="..."
。
以下是我的示例测试标记:
<!-- Must match : -->
<img class="lazy" src="http://lorempicsum.com/futurama/350/200/1" alt="Lorem ipsum" />
<img class="lazy" src="http://placehold.it/640x360/abd125/fff" />
<img class="lazy" src="http://placehold.it/640x360/000/fff"
alt="Blabla" />
<!-- Must not match : -->
<img class="lazy" src="http://placehold.it/255x200/111/fff&text=loading" data-original="http://lorempicsum.com/futurama/255/200/2" width="255" height="200" alt="" />
<img src="http://placehold.it/640x360/111/fff" alt="Blabla" />
<img src="http://placehold.it/640x360/333/fff"
alt="Blabla" />
我写了这个:<img[^>]*class\s*=\s*["']lazy["'][^>]*(?!data-original)[^>]*>
这不起作用,因为它与第4个标签匹配,但它不能。
你能帮帮我吗?感谢。P.S。别担心,我没有尝试parse html the Cthulhu Way,我只需要快速找到这些标签来修复大量的网页模板,这是一次性的伎俩...
答案 0 :(得分:3)
您必须在(?![^>]*data-original)
标记后确切地检查否定前瞻img
。
<img(?![^>]*data-original)[^>]*class\s*=\s*["']lazy["'][^>]*>
答案 1 :(得分:1)
你需要以某种方式修复前瞻,因为如果它移动,你可能会错过'如果匹配失败'部分,那么将class='lazy'
放在前瞻中也是一个好主意,并且你也许可以这样做:
<img(?=[^>]*class\s*=\s*(["'])lazy\1)(?![^>]*data-original)[^>]*>
这样,您就不必担心订单data-original
和class='lazy'
也会出现。