7

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

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

我想删除某种类型的所有标签。让我们以 allpspan标签为例。

这是我能想到的最好的:

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 的回答:使用 jquery 从字符串中剥离跨度标签

4

4 回答 4

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

于 2012-07-11T22:49:45.760 回答
2

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

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

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

您可以替换特定的标签,{removeTags:[p]}它仍然会呈现内容而不是标签。

于 2012-07-11T22:33:05.777 回答
0

我必须做类似的事情:阻止文本块包含除<b>,<i>或之外的任何 HTML 标记<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();
}

希望这可以帮助!

于 2013-05-28T19:25:10.417 回答
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();
}
于 2017-10-12T18:38:10.927 回答