【发布时间】:2010-12-27 02:39:22
【问题描述】:
假设有一个 HTML 字符串,带有脚本标签、纯文本等等。
只去除<a> 标签的最佳方法是什么?
我在这里使用了一些方法,但这些方法适用于所有标签。 Strip HTML from Text JavaScript
【问题讨论】:
-
要保留标签的内容吗?
标签: javascript jquery html parsing text
假设有一个 HTML 字符串,带有脚本标签、纯文本等等。
只去除<a> 标签的最佳方法是什么?
我在这里使用了一些方法,但这些方法适用于所有标签。 Strip HTML from Text JavaScript
【问题讨论】:
标签: javascript jquery html parsing text
使用 jQuery:
var content = $('<div>' + htmlString + '</div>');
content.find('a').replaceWith(function() { return this.childNodes; });
var newHtml = content.html();
添加一个包装 <div> 标记可以让我们返回所需的 HTML。
我在博客上写了more detailed explanation。
【讨论】:
.contents() 返回实际的 DOM 元素,因此应保留处理程序。 (懒得查了)
这种方法将保留现有的 DOM 节点,如果锚点中的元素附加了事件,则可以最大限度地减少副作用。
function unwrapAnchors() {
if(!('tagName' in this) || this.tagName.toLowerCase() != 'a' || !('parentNode' in this)) {
return;
}
var childNodes = this.childNodes || [], children = [], child;
// Convert childNodes collection to array
for(var i = 0, childNodes = this.childNodes || []; i < childNodes.length; i++) {
children[i] = childNodes[i];
}
// Move children outside element
for(i = 0; i < children.length; i++) {
child = children[i];
if(('tagName' in child) && child.tagName.toLowerCase() == 'a') {
child.parentNode.removeChild(child);
} else {
this.parentNode.insertBefore(child, this);
}
}
// Remove now-empty anchor
this.parentNode.removeChild(this);
}
使用(使用 jQuery):
$('a').each(unwrapAnchors);
使用(不带 jQuery):
var a = document.getElementsByTagName('a');
while(a.length) {
unwrapAnchors.call(a[a.length - 1]);
}
【讨论】:
var elem = arguments[0] || this
el 将是迭代器。
【讨论】:
<a> 标签是有效的 HTML。 (相对于 XHTML)
<a> 标签,我不知道它在 HTML 中是否有效。但这并没有真正的意义,而且我还没有见过这样的事情。因此,如果您信任字符串的来源,则 regexp 方法大部分时间都可以工作。
<a> 标签也是锚点(用于# 链接)。锚点没有内容。
如果关注性能,这里有一个本地(非库)解决方案。
function stripTag(str, tag) {
var a, parent, div = document.createElement('div');
div.innerHTML = str;
a = div.getElementsByTagName( tag );
while( a[0] ) {
parent = a[0].parentNode;
while (a[0].firstChild) {
parent.insertBefore(a[0].firstChild, a[0]);
}
parent.removeChild(a[0]);
}
return div.innerHTML;
}
像这样使用它:
alert( stripTag( my_string, 'a' ) );
【讨论】: