Отрицательный взгляд на разбор HTML

У меня есть такой шаблон:

/<img([^>]*?)(?!\sdata-src=([\'\"])[\S\h\v]*?\2)\ssrc=([\'\"])([\S\h\v]*?)\3/igm

И вот чего я хочу добиться:

<img src="test'"/> # this should be matched, and it is
<img data-src="abc" src="abc"/> # this one shouldn't be matched, but it is

Я не понимаю, почему мой отрицательный взгляд не работает — как вы можете видеть, я не хочу data-src параметр появится перед src параметр.

Для проверки своих выражений я использую regex101 и на этом основан мой пример. Я буду использовать это регулярное выражение в PHP.

Чтобы удовлетворить сообщество PHP:

$html = '<img src="test\'"/><img data-src="abc" src="abc"/>';
$html = preg_replace('/<img([^>]*?)(?!\sdata-src=([\'\"])[\S\h\v]*?\2)\ssrc=([\'\"])([\S\h\v]*?)\3/i', '<img$1 data-src=$3$4$3 src=$3placeholder$3', $html);
echo $html;
>>> <img data-src="test'" src="placeholder"/><img data-src="abc" src="abc"/>

-1

Решение

Ваш ([^>]*?) перепутал. Пытаться.

<img (?!data-src=['"])[^>]*?src=(['"])(.*?)\1

увидеть https://regex101.com/r/wKQk4p/1

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]