一个环视正则表达式,用于查找没有这两个属性的html标记

时间:2014-03-21 13:59:05

标签: html regex regex-negation regex-lookarounds

我需要一个正则表达式来搜索某些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,我只需要快速找到这些标签来修复大量的网页模板,这是一次性的伎俩...

2 个答案:

答案 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-originalclass='lazy'也会出现。

regex101 demo