При работе с HTML (или любым XML) регулярное выражение никогда не является ответом. Есть слишком много ошибок.
Вместо этого вам понадобится что-то вроде jQuery или Cheerio (которое имитирует API jQuery, но содержит только средства для преобразования и манипулирования HTML без дополнительного материал), который понимает фактическую структуру. Если вы доверяете контенту, вы также можете сбросить HTML в элемент HTML с помощью innerHTML
и получить к нему доступ с помощью querySelector()
.
Тогда это всего лишь вопрос выбора элемента (ов). ) вы не хотите и удаляете их.
Вот пример использования третьего варианта:
const content = '<p>a</p><p>b</p><tag>c</tag><tag><p>d</p></tag><blockquote>e</blockquote>';
const dummy = document.querySelector('#dummy');
const output = document.querySelector('#output');
dummy.innerHTML = content;
const toRemove = Array.from(dummy.querySelectorAll('p, tag, blockquote')).filter(el =>
// for the "element containing certain element" you can't do that with selector along, but can with a filter method
!(
(el.tagName === 'P' && el.parentNode.tagName === 'TAG')
|| (el.tagName === 'TAG' && el.querySelector('p'))
)
);
toRemove.map(el => el.parentNode.removeChild(el));
output.innerHTML = dummy.innerHTML;
dummy.innerHTML = ''; // empty it out
<div id="dummy"></div>
<div id="output"></div>