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

Регулярное выражение для замены img на picture?

Есть такие фотографии:

<img alt="image-1" src="/assets/1.jpg" class="image-n-n">
<img class="n-class" src="/assets/2.jpg"/>
<img alt="image-5" src="https://n.n/5.png">


Т.е любая вариация фотографий, и необходимо их заменить (Их может быть любое количество) на picture, кроме тех, которые ведут на сторонние ресурсы(Это не обязательно):

<picture>
 <source srcset="/assets/1.jpg" type="image/svg+xml">
 <img alt="image-1" src="/assets/1.jpg" class="image-n-n">
</picture>

<picture>
 <source srcset="/assets/2.jpg" type="image/svg+xml">
 <img class="n-class" src="/assets/2.jpg"/>
</picture>

<img alt="image-5" src="https://n.n/5.png">


У меня даже идей нет как это сделать((
  • Вопрос задан
  • 228 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Как получить src:

const getSrc = img => img.getAttribute('src');
// или
const getSrc = img => img.attributes.src.value;

Чтобы дальше два раза одно и то же не писать, небольшой декоратор:

const relativeOnly = f => img => {
  const src = getSrc(img);
  if (!/^https?:\/\//.test(src)) {
    f(img, src);
  }
};

Можно перезаписывать разметку:

document.querySelectorAll('img').forEach(relativeOnly((img, src) =>
  img.outerHTML = `
    <picture>
      <source srcset="${src}" type="image/svg+xml">
      ${img.outerHTML}
    </picture>`
));

Или, создавать новые элементы напрямую:

const wrapImages = relativeOnly((img, src) => {
  const picture = document.createElement('picture');
  const source = document.createElement('source');
  source.srcset = src;
  source.type = 'image/svg+xml';
  img.replaceWith(picture);
  picture.append(source, img);
});

for (const n of document.getElementsByTagName('img')) {
  wrapImages(n);
}

// или

Array.prototype.forEach.call(document.images, wrapImages);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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