У меня есть фрагмент HTML, который я хотел бы проанализировать и удалить все теги html, за исключением определенного тега, который я хочу сохранить. Я уже сделал это, но я думаю, что есть лучший способ сделать это. В приведенном ниже примере я просто хочу сохранить тег em (чтобы сохранить выделенный текст):
html = "<div><b>Info:</b> <p>This is a <em>HTML</em> block that <span>I would like</span> to parse and fix</p></div>";
description = $(html).text();
var ems = $(html).find("em"); // Find all em tags
// Search on the original description for each em text, and add the tag between.
$(ems).each(function(){
description = description.replace(this.innerHTML, "<em>" + this.innerHTML + "</em>");
});
console.log(description);
Результатом этого кода является:
Info: This is a <em>HTML</em> block that I would like to parse and fix
Любая другая идея для этого?
Не обязательно должен быть jQuery, может быть чистым javascript.
благодаря
Вы можете использовать .unwrap(), чтобы сделать это
html = "<div><b>Info:</b> <p>This is a <em>HTML</em> block that <span>I would like</span> to parse and fix</p></div>";
var $h = $('<div>'+html+'</div>');
$h.find('*:not(em)').contents().unwrap();
console.log($h.html())
Демо: скрипка
Мне кажется, что вы хотите заменить все элементы своим содержимым, за исключением <em>
:
var tmp = document.createElement('div');
tmp.innerHTML = html;
var tags = tmp.getElementsByTagName('*'), l = tags.length, i;
for( i=0; i<l; i++) {
if( tags[i].tagName == "EM") continue;
while(tags[i].firstChild) {
tags[i].parentNode.insertBefore(tags[i].firstChild,tags[i]);
}
tags[i].parentNode.removeChild(tags[i]);
}
var result = tmp.innerHTML;