Как получить все встроенные стили из строки html (JS)

(JavaScript) У меня есть HTML-шаблон электронной почты в строке. Как собрать все встроенные стили, которые используются в шаблоне?

например, у меня есть ввод

<div style = "min-width:300px;max-width:600px;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;margin:0 auto;" align = "center">
  <div style = "margin: 0 auto;padding: 20px;">
    <a href = "/" style = "text-decoration: none;">
       <img src = "https://i.ibb.co/KXYtCNT/Logo-wellness-w.png" alt = "" width = "84px" />
    </a>
  </div>
</div>

Взамен мне нужно ['min-width','max-width','overflow-wrap','word-wrap','word-break','margin','padding','text-decoration']

Я думаю, что лучше всего использовать Regex, но не знаю, как его написать. Используйте что-то подобное для тегов:

const tagRegex = /</?[\w\d]+>/gi;

и это для стилей, но не работает:

const styleRegex = /(.*?)+:[\w\d]+;/;

Просто из интереса, зачем просто перечислять все встроенные стили? Если вам нужно воссоздать правильные правила CSS с помощью селекторов, вам также необходимо установить классы или идентификаторы для элементов, чтобы перенацелить их. Обычно большинство программ для чтения почты удаляют идентификаторы, поскольку они уже могут использоваться в веб-клиенте электронной почты (например, gmail.com или outlook.com). Чтобы информационные бюллетени отображались правильно, очень часто задаются встроенные правила CSS с атрибутом style. У меня лично есть чистые правила CSS в теге <style> и я использую встроенный CSS, такой как templates.mailchimp.com/resources/inline-css или библиотеку NodeJS.

Patrick Janser 27.04.2023 15:54

В письмах я использую только встроенные стили и <style> в заголовке. Я хочу забрать его для проверки с помощью Могу ли я отправить по электронной почте db

Marharyta 27.04.2023 17:37

Хорошо! Я понимаю. Хорошая идея проверить их :-). Я думаю, что ответ Квентина с методом DOMParser: parseFromString(), вероятно, самый безопасный. Но если нет, быстрое регулярное выражение, такое как /<\s*\w+\s[^>]*style\s*=\s*(["'])(.*?)\1/g, поможет извлечь атрибут стиля из группы захвата номер 2 ($2).

Patrick Janser 27.04.2023 18:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите что-то безопасное, используйте метод DOMParser:parseFromString(), как упомянул Квентин.

const HTML = `<div style = "min-width:300px;max-width:600px;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word;margin:0 auto;" align = "center">
  <div style = "margin: 0 auto;padding: 20px;">
    <a href = "/" style = "text-decoration: none;">
       <img src = "https://i.ibb.co/KXYtCNT/Logo-wellness-w.png" alt = "" width = "84px" />
    </a>
  </div>
</div>`;

// Pattern explained here: https://regex101.com/r/K4z8M4/1
const CSS_PATTERN = /([\w-]*)\s*:\s*(.*?)(?=\s*(?:;|$))/g;

const parser = new DOMParser();
const doc = parser.parseFromString(HTML, 'text/html');
const domElements = doc.querySelectorAll('body *');

domElements.forEach((e) => {
  if (e.style.cssText != '') {
    console.info('Found style attribute on <' + e.tagName + '>');
    console.info('Inline CSS = "' + e.style.cssText + '"');
    console.info('Get CSS rules with regex:');
    // Split the inline CSS with a regex.
    const matches = e.style.cssText.matchAll(CSS_PATTERN);
    for (const match of matches) {
      console.info('  ' + match[1] + ': ' + match[2]);
    }
    
    // The style object of the DOM element has some numeric
    // attributes, which seems to be all the CSS rules applied
    // from the CSS text. This might be more precise than
    // the CSS text itself, as it may contain some errors.
    console.info('Affected style rules:');
    for (const [key, value] of Object.entries(e.style)) {
      // Check if the key is numeric.
      // Only tested on Chrome, Firefox and Edge.
      if ((key + "").match(/^\d+$/)) {
        console.info('  ' + value);
      }
    }
  }
});

Как видите, я использовал регулярное выражение для соответствия правилам CSS. Этот это потому, что я заметил, что атрибут style элемента DOM имеет некоторые правила CSS отличаются от тех, что объявлены в CSS. Например если у вас есть margin: 1em то margin-top, margin-right, margin-bottom и margin-left затронуты. Но вы, наверное, хотите чтобы в вашем списке было только правило margin.

Если вам нужно какое-то объяснение регулярного выражения для разделите правила CSS, вы можете прочитать описание шаблона Я создал здесь: https://regex101.com/r/K4z8M4/1

Другие вопросы по теме