我在我的应用程序中使用了一个NicEdit富文本编辑器(基于内容的可编辑div),用户喜欢从单词粘贴。
所以我想删除任何可能粘贴的垃圾标签。
这是我目前正在做的事情。
//build regex to match junk tags
var unwantedtags = [ "font", "span", "table", "tbody", "div", "td", "tr", "input", "a",
"body", "button", "form", "head", "img", "select", "textarea", "tfoot", "th", "iframe", "object" ];
var unwantedregexstring= "";
$.each(unwantedtags, function(index, value) {
if(unwantedregexstring!= "") {
unwantedregexstring += "|";
}
unwantedregexstring+= "<" + value + ">";
unwantedregexstring+= "|";
unwantedregexstring+= "<" + value + "\\s[^>]*>";
unwantedregexstring+= "|";
unwantedregexstring+= "</" + value + ">";
});
var unwantedRegex = new RegExp(unwantedregexstring, "igm");
//replace junk tags with nothing
function CleanMSWordPaste(mswordtext) {
return mswordtext.replace(unwantedRegex, "");
}
//Function that gets Executed on Paste event
function ExecutePaste(){
//preserve user's selected text
var oldRng = document.selection.createRange();
//create paste area off screen and paste there
$('body').append("<div id='paster' contenteditable='true' style='height:1px;width:1px;position:fixed;left:-100px;top:-100px;'></div>");
$('#paster').focus();
$('#paster')[0].document.execCommand('paste', null, null);
//if html contains junk tags
if(unwantedRegex.test($('#paster').html())) {
//replace html with cleaned html
$('#paster').html(CleanMSWordPaste($('#paster').html()));
//select all content of paste area
var rng = document.body.createTextRange();
rng.moveToElementText($('#paster')[0]);
rng.select();
//copy cleaned html
$('#paster')[0].document.execCommand('copy', null, null);
}
//remove paste area from dom
$('#paster').remove();
//restore user's selected text
oldRng.select();
//preserves scroll position, focuses NicEditor and performs doc.execCommand('paste')
//performance of this alone is fine.
ExecCommand('paste');
}
我发现这需要相当长的时间(来自单词的前1页)。有什么办法可以加快速度吗?我正在考虑某种正则表达式优化,但我并不知道正则表达式如何工作。
答案 0 :(得分:1)
你可以做的一件事是保存对$('#paster')
的引用,这样你就不必经常重新运行$(),这是一个相当复杂的函数,可能非常繁重。
$paster = $('#paster') //dollar sign in variable name not necessary
//I just do it so I know it's a JQuery object.
unwantedRegex.test($paster.html());
$paster.focus();
//etc
另外
$('#paster')[0].document.execCommand('copy', null, null);
不确定你正在使用的是什么$('#paster')[].document
你应该能够运行document.execCommand(),不是吗?
答案 1 :(得分:1)
您的unwantedregexstring
似乎最终会看起来像这样:
'<font>|<font\s[^>]*>|</font>|<span>|<span\s[^>]*>|</span>|...'
我不是regexp引擎内部的专家,但对我来说这看起来有点过于冗长。如果您更改算法以使unwantedregexstring
看起来像这样,该怎么办?
'</?(font|span|...)\s?.*?>'
这将寻找一个<
后跟一个可选的/
,后跟一个指定的标签,后跟一个可选的空白字符,后跟零或更多,但尽可能少的任何字符,直到遇到了结束>
。