2010-05-20 77 views
22

我正在使用'contenteditable'<div/>并启用了PASTE。使用JavaScript清理Microsoft Word粘贴文本

令人惊讶的是从Microsoft Word的剪贴板拷贝中粘贴的标记代码的数量。我正在与此作斗争,并且使用原型'stripTags()函数(,其中不幸似乎不能使我保留一些标签)已经以大约1/2的方式获得了。

但是,即使在那之后,我还是头脑发现了一些不需要的标记代码。

所以我的问题是,是否有一些函数(使用JavaScript),或我可以使用的方法将清理大多数这种不需要的标记?

+0

好运与此...从Word生成的内容(无论是在粘贴,并保存为HTML留下许多有待改进);-) – scunliffe 2010-05-20 15:10:29

+0

我问或多或少同样的问题,然后在http://stackoverflow.com/questions/391291/how-do-i-remove-word-markup-crap-when-inserting-to-a-form,但你的标题更好。虽然,为什么限制自己的JavaScript和不考虑在服务器上做到这一点? – 2010-05-20 18:46:39

回答

18

以下是我写完的功能,可以很好地完成这项工作(据我所知,无论如何)。

如果有人有任何问题,我肯定会打开改进建议。谢谢。

function cleanWordPaste(in_word_text) { 
var tmp = document.createElement("DIV"); 
tmp.innerHTML = in_word_text; 
var newString = tmp.textContent||tmp.innerText; 
// this next piece converts line breaks into break tags 
// and removes the seemingly endless crap code 
newString = newString.replace(/\n\n/g, "<br />").replace(/.*<!--.*-->/g,""); 
// this next piece removes any break tags (up to 10) at beginning 
for (i=0; i<10; i++) { 
    if (newString.substr(0,6)=="<br />") { 
    newString = newString.replace("<br />", ""); 
    } 
} 
return newString; 
} 

希望这对你们中的一些人有帮助。

2

如何将“粘贴为纯文本”按钮显示<textarea>,允许用户粘贴文本?这样,所有的标签都会被剥夺。这就是我用CMS做的事情;我放弃了试图清理Word的混乱。

+0

这将是我最糟糕的情况,我想(和它的样子,可能是唯一的场景 - 非常令人沮丧)。 – OneNerd 2010-05-20 15:38:38

+0

@OneNerd:我将你的问题标记为最爱,因为如果其他人有更好的解决方案,我想我也会使用它! – Josh 2010-05-20 18:12:34

+0

我想出了一些我认为可能有用的东西 - 如果你愿意的话,请参阅我的回答(并改进它)。谢谢 - – OneNerd 2010-05-20 18:17:35

3

您可以使用完整的CKEditor清除粘贴或look at the source

+0

任何想法在哪里确切的功能(什么文件)? – OneNerd 2010-05-20 15:41:42

+2

从* .. \ fckeditor \ editor \ _source \ commandclasses \ fckpastewordcommand.js *开始并向后走。 – 2010-05-20 16:03:57

-1

您可以粘贴到隐藏的textarea,从相同的textarea复制并粘贴到您的目标?

+0

嗯 - 你知道一种方法将粘贴的内容发送到textarea,所以它确实是纯文本而不是标记代码 - 由于按键位于DIV上,我可以读取内容并将其传递给textarea ,但它不会是明文的。 – OneNerd 2010-05-20 15:40:04

+0

我认为只留下文字并不是最好的解决方案。格式很重要。我在一个应用程序中工作,我的客户不希望删除单词中的样式。 – 2014-07-25 12:47:52

-4

讨厌这么说,但我最终放弃了让TinyMCE处理Word废话的方式。每当用户输入包含特定的HTML时(例如,查找<span lang="en-US">),我都会收到一封电子邮件,并且我会手动更正它。

+3

Yikes - 对我来说不是一种选择。 – OneNerd 2010-05-20 15:40:53

+0

这是一个非常好的主意,直到您的应用程序拥有超过0个用户。 – 2015-11-04 20:42:35

0

我做了很久以前的事情,在那里我完全清理了富文本编辑器中的东西,并将字体标记转换为样式,brs到p等,以保持浏览器之间的一致性并防止某些丑陋的东西通过粘贴。除了核心逻辑之外,我使用了递归函数并删除了大部分内容,这可能是一个很好的起点(“结果”是一个积累结果的对象,可能需要第二次转换才能转换为字符串),if这是你所需要的:

var cleanDom = function(result, n) { 
var nn = n.nodeName; 
if(nn=="#text") { 
    var text = n.nodeValue; 

    } 
else { 
    if(nn=="A" && n.href) 
     ...; 
    else if(nn=="IMG" & n.src) { 
     .... 
     } 
    else if(nn=="DIV") { 
     if(n.className=="indent") 
      ... 
     } 
    else if(nn=="FONT") { 
     }  
    else if(nn=="BR") { 
     } 

    if(!UNSUPPORTED_ELEMENTS[nn]) { 
     if(n.childNodes.length > 0) 
      for(var i=0; i<n.childNodes.length; i++) 
       cleanDom(result, n.childNodes[i]); 
     } 
    } 
} 
3

我使用这个:

$(body_doc).find('body').bind('paste',function(e){ 
       var rte = $(this); 
       _activeRTEData = $(rte).html(); 
       beginLen = $.trim($(rte).html()).length; 

       setTimeout(function(){ 
        var text = $(rte).html(); 
        var newLen = $.trim(text).length; 

        //identify the first char that changed to determine caret location 
        caret = 0; 

        for(i=0;i < newLen; i++){ 
         if(_activeRTEData[i] != text[i]){ 
          caret = i-1; 
          break; 
         } 
        } 

        var origText = text.slice(0,caret); 
        var newText = text.slice(caret, newLen - beginLen + caret + 4); 
        var tailText = text.slice(newLen - beginLen + caret + 4, newLen); 

        var newText = newText.replace(/(.*(?:endif-->))|([ ]?<[^>]*>[ ]?)|(&nbsp;)|([^}]*})/g,''); 

        newText = newText.replace(/[·]/g,''); 

        $(rte).html(origText + newText + tailText); 
        $(rte).contents().last().focus(); 
       },100); 
      }); 

body_doc是可编辑的iframe,如果您使用的是可编辑的DIV,你可以退出了.find(“主体”)部分。基本上,它检测粘贴事件,检查位置清理新文本,然后将清除的文本放回到粘贴的位置。 (听起来令人困惑......但它并不像听起来那么糟糕)

setTimeout是需要的,因为直到它实际上粘贴到元素中,才能获取文本,一旦粘贴开始就粘贴事件。

0

这个伟大的工程,从HTML文本中删除任何意见,包括那些从Word:

function CleanWordPastedHTML(sTextHTML) { 
    var sStartComment = "<!--", sEndComment = "-->"; 
    while (true) { 
    var iStart = sTextHTML.indexOf(sStartComment); 
    if (iStart == -1) break; 
    var iEnd = sTextHTML.indexOf(sEndComment, iStart); 
    if (iEnd == -1) break; 
    sTextHTML = sTextHTML.substring(0, iStart) + sTextHTML.substring(iEnd + sEndComment.length); 
    } 
    return sTextHTML; 
} 
0

曾与换行符类似的问题被算作人物,我不得不将其删除。

$(document).ready(function(){ 
 

 
    $(".section-overview textarea").bind({ 
 
    paste : function(){ 
 
    setTimeout(function(){ 
 
     //textarea 
 
     var text = $(".section-overview textarea").val(); 
 
     // look for any "\n" occurences and replace them 
 
     var newString = text.replace(/\n/g, ''); 
 
     // print new string 
 
     $(".section-overview textarea").val(newString); 
 
    },100); 
 
    } 
 
    }); 
 
    
 
});