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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы хотите что-то безопасное, используйте метод 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