@AlexandrKom

Регулярное выражение JS для замены тега и содержимого?

Господа, нужна ваша помощь, в тексте есть html-тэги подобного типа:

<span class="c56 c77 c98">текст</span>
<span class="c101">текст</span>
<span class="c111">текст</span>
<span class="c12 c30 c98">текст</span>


нужно заменить только те теги в которых присутствует класс из массива ['c77', 'c98', 'c101'] на тег , получив результат
<b>текст</b>
<b>текст</b>
<span class="c111">текст</span>
<b>текст</b>
  • Вопрос задан
  • 137 просмотров
Решения вопроса 1
Seasle
@Seasle Куратор тега JavaScript
Используйте DOM.
const tempalte = `
<span class="c56 c77 c98">текст</span>
<span class="c101">текст</span>
<span class="c111">текст</span>
<span class="c12 c30 c98">текст</span>
`;

const parser = new DOMParser();
const root = parser.parseFromString(tempalte, 'text/html');

root.querySelectorAll('.c77, .c98, .c101').forEach((element) => {
    const content = document.createElement('b');
    content.append(...element.childNodes);
    element.replaceWith(content);
});

console.log(root.body.innerHTML);
/*
<b>текст</b>
<b>текст</b>
<span class="c111">текст</span>
<b>текст</b>
*/

Регулярками примерно так

const template = `
<span class="c56 c77 c98">текст</span>
<span class="c101">текст</span>
<span class="c111">текст</span>
<span class="c12 c30 c98">текст</span>
`.trim();
const classNames = ['c77', 'c98', 'c101'];

let result = template;
for (const className of classNames) {
    const expression = new RegExp(`<([\\w-]+)\\s*class=".*${className}.*"\\s*>(.+)</\\1>`, 'gm');
    result = result.replace(expression, (match, tag, content) => `<b>${content}</b>`);
}

или
const classNames = ['c77', 'c98', 'c101'];
const expression = new RegExp(`<([\\w-]+)\\s*class=".*(${classNames.join('|')}).*"\\s*>(.+)</\\1>`, 'gm');
const result = template.replace(expression, (match, tag, className, content) => `<b>${content}</b>`);

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы