Jquery: убрать все определенные теги HTML из строки

У меня есть переменная, которая содержит строку текста и HTML-теги, такие как:

var temp = "<div>Some text</div><p>More text<span>here</span></p><p>Even more</p>";

Я хотел бы удалить все теги определенного типа. Давайте скажем всеp а такжеspan теги к примеру.

Это лучшее, что я могу придумать:

var temp = "<div>Some text</div><p>More text<span>here</span></p><p>Even more</p>";
var $temp = $(temp);
$("p", $temp).replaceWith("foo");
alert($temp.html());  //returns "Some text"

Ближайший ответ, который я смог найти, - это ответ Ника Крейвера:вырезать теги из строки с помощью jquery.

 undefined12 июл. 2012 г., 00:30
что это такоеcertain type?
 iammatthew212 июл. 2012 г., 00:46
отредактированный вопрос: теги p и теги span - это то, что я хочу заменить. Но это может измениться в будущем.

Ответы на вопрос(4)

Вы можете попробоватьплагин jquery HTML Clean, В примере они предоставляют:

$.htmlClean("<H1 class=\"header\"><P>Nested P Test</H1>", {format:true});

=> 
<h1>
        Nested P Test
</h1>

Вы можете заменить определенные теги на{removeTags:[p]} и он по-прежнему будет отображать содержимое, а не тег.

 iammatthew212 июл. 2012 г., 00:47
Спасибо! Я попробую, но я подумал, что Jquery мог бы позаботиться об этом с помощью всего лишь нескольких строк кода.

Я буду следить за @nbrooks, потому что его ответ очень близок к тому, что вы хотите, но не совсем. @nbrooks ударил по решению, отметив, что html () предоставляет вам данные, заключенные в тег. Поэтому решение заключается в том, чтобы заключить ваш HTML в тег. Это должно помочь вам:

var temp = "<div>Some text</div><p>More text<span>here</span></p><p>Even more</p>";
$("<span>" + temp + "</span>").find('span,p').
  contents().unwrap().end().end().html()`

Увидетьhttp://jsfiddle.net/18u5Ld9g/1/ для примера.

Как более общая функция:

function stripTags(html, tags) {
  // Tags must be given in CSS selector format
  return $("<span>" + html + "</span>").find(tags).
    contents().unwrap().end().end().html();
}

Я должен был сделать что-то подобное: сохранить блок текста, содержащий любой HTML-тег, кроме<b>, <i> или же<u>, Этот вопрос и несколько других указали мне на мою собственную функцию:

function cleanNonFormattingTags(htmlContents) {
    if (htmlContents && htmlContents.length) {
        var result = '';
        htmlContents.each(function () {
            var $child = $(this), type = $child.prop('tagName'), isTextNode = this.nodeName == "#text";
            if (isTextNode) {
                result += this.textContent;
            }
            else if (type == 'B' || type == 'U' || type == 'I' || type == 'BR') { // Allow only these types of tags
                var innerContent = cleanNonFormattingTags($child.contents());
                var $newTag = $(document.createElement(type)).html(innerContent);
                result += $newTag[0].outerHTML;
            }
            else {
                result += cleanNonFormattingTags($child.contents());
            }
        });
        return result;
    }
    return htmlContents.text();
}

Надеюсь это поможет!

Решение Вопроса

Демо-версия:http://jsfiddle.net/VwTHF/1/

$('span, p').contents().unwrap();

.contents() получит элементы и текст внутри каждого такого тега, и.unwrap удалит элемент, обертывающий каждый раздел содержимого.

Исходя из вашего текущего подхода, это будет выглядеть примерно так:

var temp = "<div>Some text</div><p>More text<span>here</span></p><p>Even more</p>";
var $temp = $(temp);
$temp.find('span, p').contents().unwrap().end().end();

Если вы хотите продолжить нацеливание на оригинальный объект, вы должны использовать.end() очистить фильтр.

 iammatthew212 июл. 2012 г., 01:04
Да, я просто хочу удалить определенные теги и сохранить текст и все другие теги. Но я не смог заставить работать вышеперечисленное в этом примере: [jsfiddle.net/nEFhA/]
 iammatthew212 июл. 2012 г., 01:11
Это действительно так - спасибо! Теперь, как мне запустить это для строки, содержащейся в переменной? Я неудачно попробовал это:jsfiddle.net/PgJnW
 12 июл. 2012 г., 01:16
Замечания:.html() вернет только содержимое элемента - толькоdiv содержание..text() вернет все.jsfiddle.net/VwTHF/1
 12 июл. 2012 г., 00:50
Надеюсь, я не правильно понял ваш вопрос. Вы просто пытаетесь избавиться от тегов, но оставляете текст правильно?
 12 июл. 2012 г., 01:05
@ iammatthew2 Это прекрасно работает. Вы забыли включить jQuery:jsfiddle.net/WPpqE (вы должны указать структуру для использования в опциях слева)

Ваш ответ на вопрос