Jquery:从字符串中删除所有特定的HTML标记

时间:2012-07-11 22:28:28

标签: jquery

我有一个包含一串text和html标签的变量,例如:

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

我想删除某种类型的所有标签。我们可以说所有pspan代码。

这是我能想到的最好的:

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"

我能找到的最接近的答案是Nick Craver的回答:strip span tags from string with jquery

4 个答案:

答案 0 :(得分:13)

演示: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()清除过滤器。

答案 1 :(得分:2)

您可以尝试jquery plugin HTML Clean。在他们提供的示例中:

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

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

您可以使用{removeTags:[p]}替换特定代码,但仍然会将内容呈现为不是代码。

答案 2 :(得分:0)

我必须做类似的事情:保留一段文字,使其不包含<b><i><u>以外的任何HTML标记。这个问题和其他几个问题指出了我自己的职责:

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();
}

希望这有帮助!

答案 3 :(得分:0)

我会跟进@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();
}