在JavaScript上,它可以使用正则表达式删除文本中的所有HTML标记:
replace(/(<([^>]+)>)/ig, "")
此外,我想保留特定的标签。
ex)<h1>Text</h1><input type="text">Text</input><b>Text</b> → <h1>Text</h1>Text<b>Text</b>
我尝试了这段代码,但它无法正常运行。
replace(/<\/{0,1}!(font|h\d|p|hr|pre|blockquote|ol|ul|...).*?>/ig, "");
请告诉我最好的配方。
答案 0 :(得分:1)
特别是在JavaScript中,没有任何借口。
var div = document.createElement('div');
div.innerHTML = your_input_here;
var allowedtags = "font|h[1-6]|p|hr|...";
var rgx = new RegExp("^(?:"+allowedtags+")$","i");
var tags = div.getElementsByTagName('*');
var length = tags.length;
var i;
for( i=length-1; i>=0; i--) {
if( !tags[i].nodeName.match(rgx)) {
while(tags[i].firstChild) {
tags[i].parentNode.insertBefore(tags[i].firstChild,tags[i]);
// this will take all children and extract them
}
tags[i].parentNode.removeChild(tags[i]);
}
}
var result = div.innerHTML;
答案 1 :(得分:0)
您需要使用否定前瞻:
replace(/<\/?(?!(font|h[1234]|p|hr|input|pre|blockquote|ol|ul))[^>]*>/ig, "");
警告:使用这样的正则表达式,HTML解析和操作容易出错。最好使用DOM解析器。
答案 2 :(得分:0)
如何使用这样一个简单的函数删除不需要的标签:
function sanitize(text, allowed) {
var tags = typeof allowed === 'string' ? allowed.split(',') : allowed;
var a = document.createElement('div');
a.innerHTML = text;
for (var c = a.childNodes, i = c.length; i--;) {
if (c[i].nodeType == 1) {
c[i].innerHTML = sanitize(c[i].innerHTML, tags);
if (tags.indexOf(c[i].tagName.toLowerCase()) === -1) {
c[i].parentNode.removeChild(c[i]);
}
}
}
return a.innerHTML;
}
sanitize('<h1>This is a <script>alert(1)</script> test</h1> <input type="text"> and <b>this</b> should stay.', 'font,h1,h2,p,b,ul')
输出:
"<h1>This is a test</h1> and <b>this</b> should stay."
或者,如果您使用
,则可以使用文本内容替换标记c[i].parentNode.replaceChild(document.createTextNode(c[i].innerText);
而不是c[i].parentNode.removeChild(c[i]);