Регулярное выражение для поиска тегов HTML без обоих атрибутов

0

Мне нужно регулярное выражение для поиска 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-м тегу, и он не должен.

Вы можете мне помочь? Благодарю.

PS Не беспокойтесь, парни, я не пытаюсь разобрать html Cthulhu Way, мне просто нужно быстро найти эти теги, чтобы исправить большое количество веб-шаблонов, это трюк с одним выстрелом...

Теги:
regex-negation
regex-lookarounds

2 ответа

1
Лучший ответ

Вам нужно как-то исправить взгляд, потому что, если он движется, вы можете пропустить часть "fail if match", и также может быть хорошей идеей поставить class='lazy' в lookahead, а также, возможно, делай это так:

<img(?=[^>]*class\s*=\s*(["'])lazy\1)(?![^>]*data-original)[^>]*>

Таким образом, вам не нужно беспокоиться о data-original заказа data-original и class='lazy'.

regex101 demo

3

Вы должны проверить отрицательный lookahead (?![^>]*data-original) именно после тега img.

<img(?![^>]*data-original)[^>]*class\s*=\s*["']lazy["'][^>]*>
  • 0
    Спасибо обоим (вам и ответу Джерри), это работает!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню