Задать вопрос
@belyaevcyrill

Как достать из html-строки src и srcset всех картинок?

Есть 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 одновременно. Что надо поправить?
  • Вопрос задан
  • 157 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
dollar
@dollar
Делай добро и бросай его в воду.
Короткий ответ:
/(?<=<img [^<>]*?)src(?:set)?="([^"]*)"/g

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

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

Как получить коллекцию элементов img:

const { images } = new DOMParser().parseFromString(html, 'text/html');

// или

const images = document
  .createRange()
  .createContextualFragment(html)
  .querySelectorAll('img');

// или

const images =
  (el => (el.innerHTML = html, el.getElementsByTagName('img')))
  (document.createElement('div'));

Как из img извлечь значения src и srcset:

const getSrc = img => [ img.src, img.srcset ];

// или

const getSrc = img => [ 'src', 'srcset' ].map(n => img.getAttribute(n));

// или

const getSrc = ({ attributes: a }) => [ a.src.value, a.srcset.value ];

Извлекаем:

const result = Array.from(images, getSrc);

// или

const result = Array.prototype.map.call(images, getSrc);

// или

const result = [];
for (const n of images) {
  result.push(getSrc(n));
}

// или

const result = [];
for (let i = 0; i < images.length; i++) {
  result[i] = getSrc(images[i]);
}
Ответ написан
Ваш ответ на вопрос

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

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