@belyaevcyrill

Как правильно построить регулярку?

Есть html-строка вида:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do 
<img src="/files/60570fa5c3bef305257abd06" srcset="/files/60570fa503bef3c5257abd07 320w"> 
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, 
quis nostrud exercitation ullamco laboris nisi ut aliqu 
<img src="/files/60570f05c3bef3c5257abd78" srcset="/files/60570fa5c3bef3c5207abd90 3200w">


Не получается с помощью регулярки вида
/<img[^\>]*(src(set)?="([^"]*)")+>/g
получить для каждого img значения src и srcset одновремено. Регулярка возвращает только srcset.

Например, для
<img src="/files/60570fa5c3bef305257abd06" srcset="/files/60570fa503bef3c5257abd07 320w">

регулярка отдает только значение srcset, а нужно src и srcset одновременно. Можете подсказать что поправить?
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
dollar
@dollar
Делай добро и бросай его в воду.
Короткий ответ:
/(?<=<img [^<>]*?)src(?:set)?="([^"]*)"/g

Но чем больше дополнительных условий и хотелок, тем больше доп. кода понадобится или более монструозным получится рег. выражение. Универсальный способ вряд ли получится. Всегда найдётся способ сломать регулярку.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
0xD34F
@0xD34F Куратор тега JavaScript
Не надо никаких регулярок.

Строку следует распарсить, чтобы получились узлы, из которых уже можно доставать чего там вам надо:

const data = Array.from(
  new DOMParser().parseFromString(html, 'text/html').images,
  n => [ n.getAttribute('src'), n.getAttribute('srcset') ]
);

или

const data = Array.prototype.map.call(
  document.createRange().createContextualFragment(html).querySelectorAll('img'),
  ({ attributes: a }) => [ a.src.value, a.srcset.value ]
);

или

const div = document.createElement('div');
div.innerHTML = html;
const data = [];
for (const n of div.getElementsByTagName('img')) {
  data.push([ n.src, n.srcset ]);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы