有没有人知道一个好的正则表达式来从html中删除事件。
例如字符串:
"<h1 onmouseover="top.location='http://www.google.com">Large Text</h1>
变
"<h1>Large Text</h1>
因此保留了HTML标签,但删除了诸如onmouseover,onmouseout,onclick等事件。
提前致谢!
答案 0 :(得分:4)
怎么样:
data.replace(/ on\w+="[^"]*"/g, '');
从评论中编辑:
这应该作为一次性的标记在您的标记上运行。如果您试图在页面执行期间动态删除事件,那就是一个稍微不同的故事。像jQuery这样的javascript库让它变得非常简单:
$('*').unbind();
编辑:
仅在标签内限制此内容要困难得多。我不相信它可以用一个正则表达式来完成。但是,如果没有人能想出一个,那么这应该可以帮到你:
var matched;
do
{
matched = false;
data = data.replace(/(<[^>]+)( on\w+="[^"]*")+/g,
function(match, goodPart)
{
matched = true;
return goodPart;
});
} while(matched);
编辑:
我为此写了一个正则表达式投降。必须有一些方法来检查匹配的上下文而不实际捕获匹配中的标记的开头,但我的RegEx-fu不够强大。这是我要提出的最优雅的解决方案:
data = data.replace(/<[^>]+/g, function(match)
{
return match.replace(/ on\w+="[^"]*"/g, '');
});
答案 1 :(得分:0)
这是一种纯粹的JS方法:
function clean(html) {
function stripHTML(){
html = html.slice(0, strip) + html.slice(j);
j = strip;
strip = false;
}
function isValidTagChar(str) {
return str.match(/[a-z?\\\/!]/i);
}
var strip = false; //keeps track of index to strip from
var lastQuote = false; //keeps track of whether or not we're inside quotes and what type of quotes
for(var i=0; i<html.length; i++){
if(html[i] === "<" && html[i+1] && isValidTagChar(html[i+1])) {
i++;
//Enter element
for(var j=i; j<html.length; j++){
if(!lastQuote && html[j] === ">"){
if(strip) {
stripHTML();
}
i = j;
break;
}
if(lastQuote === html[j]){
lastQuote = false;
continue;
}
if(!lastQuote && html[j-1] === "=" && (html[j] === "'" || html[j] === '"')){
lastQuote = html[j];
}
//Find on statements
if(!lastQuote && html[j-2] === " " && html[j-1] === "o" && html[j] === "n"){
strip = j-2;
}
if(strip && html[j] === " " && !lastQuote){
stripHTML();
}
}
}
}
return html;
}