2009-08-28 22 views
6

Ho installato fckeditor e quando si incolla da MS Word aggiunge un sacco di formattazione non necessaria. Voglio mantenere certe cose come grassetto, corsivo, bulltes e così via. Ho cercato sul web e ho trovato soluzioni che rimuovono tutto, anche quelle che volevo mantenere come grassetto e corsivo. C'è un modo per eliminare solo la formattazione di parole non necessaria?c'è un modo per eliminare tutta la formattazione non necessaria di MS Word da FCKEditor

+0

Chiunque abbia mai mantenuto un CMS conosce il male di cui si parla. Buona fortuna a trovare la risposta. Li abbiamo semplicemente lasciati incollare da una parola e poi ho avuto un programma che rimuoveva i caratteri non visualizzabili dal database. – Steve

risposta

7

Ecco una soluzione che uso per fregare HTML in arrivo da editor di testo avanzato ... è scritto in VB.NET e non ho tempo di convertire in C#, ma è piuttosto semplice:

Public Shared Function CleanHtml(ByVal html As String) As String 
    '' Cleans all manner of evils from the rich text editors in IE, Firefox, Word, and Excel 
    '' Only returns acceptable HTML, and converts line breaks to <br /> 
    '' Acceptable HTML includes HTML-encoded entities. 
    html = html.Replace("&" & "nbsp;", " ").Trim() ' concat here due to SO formatting 
    '' Does this have HTML tags? 
    If html.IndexOf("<") >= 0 Then 
     '' Make all tags lowercase 
     html = RegEx.Replace(html, "<[^>]+>", AddressOf LowerTag) 
     '' Filter out anything except allowed tags 
     '' Problem: this strips attributes, including href from a 
     '' http://stackoverflow.com/questions/307013/how-do-i-filter-all-html-tags-except-a-certain-whitelist 
     Dim AcceptableTags  As String = "i|b|u|sup|sub|ol|ul|li|br|h2|h3|h4|h5|span|div|p|a|img|blockquote" 
     Dim WhiteListPattern As String = "</?(?(?=" & AcceptableTags & ")notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:([""']?).*?\1?)?)*\s*/?>" 
     html = Regex.Replace(html, WhiteListPattern, "", RegExOptions.Compiled) 
     '' Make all BR/br tags look the same, and trim them of whitespace before/after 
     html = RegEx.Replace(html, "\s*<br[^>]*>\s*", "<br />", RegExOptions.Compiled) 
    End If 
    '' No CRs 
    html = html.Replace(controlChars.CR, "") 
    '' Convert remaining LFs to line breaks 
    html = html.Replace(controlChars.LF, "<br />") 
    '' Trim BRs at the end of any string, and spaces on either side 
    Return RegEx.Replace(html, "(<br />)+$", "", RegExOptions.Compiled).Trim() 
End Function 

Public Shared Function LowerTag(m As Match) As String 
    Return m.ToString().ToLower() 
End Function 

Nel tuo caso, ti consigliamo di modificare l'elenco dei "approvato" tag HTML in "AcceptableTags" - il codice sarà ancora a nudo tutti gli attributi inutili (e, purtroppo, quelli utili come HREF e SRC, spero che quelli non siano importanti per te).

Naturalmente, ciò richiede un viaggio sul server. Se non lo desideri, dovrai aggiungere una sorta di pulsante "ripulisci" alla barra degli strumenti che chiama JavaScript per interferire con il testo corrente dell'editor. Sfortunatamente, "incollare" non è un evento che può essere intrappolato per ripulire automaticamente il markup e pulire dopo ogni OnChange per un editor inutilizzabile (poiché la modifica del markup cambia la posizione del cursore del testo).

+0

Whoa..questo è fantastico. Ma ho bisogno di collegamenti e tag html di base – user161433

0

Ma fckeditor è, come suggerisce il nome e il sito Web, un editor di testo . Per me, questo significa che mostra solo i caratteri nel file.

Non è possibile avere la formattazione in grassetto e corsivo senza alcuni caratteri in più.

EDIT: Ah, capisco. Osservando più da vicino il sito web di Fckeditor, si tratta di un editor HTML, non uno dei semplici editor di testo a cui sono abituato.

C'è il numero Paste from Word cleanup with autodetection elencato come funzione.

+0

pavium, fckeditor è un editor RICH TEXT, astrae tutta la cattiveria dell'uso di DIV modificabili e aggiunge delle barre degli strumenti molto carine. Sotto il cofano, è memorizzato in HTML, il che significa che quando qualcuno incolla da Word, Word passa tutti i tipi di HTML Evilness. – richardtallent

2

Capisco molto bene il problema. Quando si esegue la copia di MS-Word (o qualsiasi area di testo sensibile al testo o di modifica di testo) e si incolla in FCKEditor (lo stesso problema si verifica con TinyMCE), il markup originale viene incluso in quello che si trova negli appunti e viene elaborato. Questo markup non è sempre in omaggio con il markup che viene incorporato nella destinazione dell'operazione incolla.

Non conosco la soluzione oltre a diventare un contributore di FCKEditor e studiare il codice e apportare la modifica. Quello che faccio normalmente è istruire gli utenti a eseguire un'operazione in due fasi.

  • Copia da MS-Word
  • incolla in Blocco note
  • Seleziona tutto
  • copia dalla clipboard
  • Incolla in FCKEditor
8

Solo nel caso qualcuno vuole una versione C# del risposta accettata:

public string CleanHtml(string html) 
    { 
     //Cleans all manner of evils from the rich text editors in IE, Firefox, Word, and Excel 
     // Only returns acceptable HTML, and converts line breaks to <br /> 
     // Acceptable HTML includes HTML-encoded entities. 

     html = html.Replace("&" + "nbsp;", " ").Trim(); //concat here due to SO formatting 
     // Does this have HTML tags? 

     if (html.IndexOf("<") >= 0) 
     { 
      // Make all tags lowercase 
      html = Regex.Replace(html, "<[^>]+>", delegate(Match m){ 
       return m.ToString().ToLower(); 
      }); 
      // Filter out anything except allowed tags 
      // Problem: this strips attributes, including href from a 
      // http://stackoverflow.com/questions/307013/how-do-i-filter-all-html-tags-except-a-certain-whitelist 
      string AcceptableTags = "i|b|u|sup|sub|ol|ul|li|br|h2|h3|h4|h5|span|div|p|a|img|blockquote"; 
      string WhiteListPattern = "</?(?(?=" + AcceptableTags + @")notag|[a-zA-Z0-9]+)(?:\s[a-zA-Z0-9\-]+=?(?:([""']?).*?\1?)?)*\s*/?>"; 
      html = Regex.Replace(html, WhiteListPattern, "", RegexOptions.Compiled); 
      // Make all BR/br tags look the same, and trim them of whitespace before/after 
      html = Regex.Replace(html, @"\s*<br[^>]*>\s*", "<br />", RegexOptions.Compiled); 
     } 


     // No CRs 
     html = html.Replace("\r", ""); 
     // Convert remaining LFs to line breaks 
     html = html.Replace("\n", "<br />"); 
     // Trim BRs at the end of any string, and spaces on either side 
     return Regex.Replace(html, "(<br />)+$", "", RegexOptions.Compiled).Trim(); 
    } 
3

provato la soluzione accettata, ma non ha pulito la parola tag generati.

Ma this code ha lavorato per me

stringa statica CleanWordHtml (stringa HTML) {

StringCollection sc = new StringCollection(); 
// get rid of unnecessary tag spans (comments and title) 
sc.Add(@"<!--(\w|\W)+?-->"); 
sc.Add(@"<title>(\w|\W)+?</title>"); 
// Get rid of classes and styles 
sc.Add(@"\s?class=\w+"); 
sc.Add(@"\s+style='[^']+'"); 
// Get rid of unnecessary tags 
sc.Add(
@"<(meta|link|/?o:|/?style|/?div|/?st\d|/?head|/?html|body|/?body|/?span|!\[)[^>]*?>"); 
// Get rid of empty paragraph tags 
sc.Add(@"(<[^>]+>)+&nbsp;(</\w+>)+"); 
// remove bizarre v: element attached to <img> tag 
sc.Add(@"\s+v:\w+=""[^""]+"""); 
// remove extra lines 
sc.Add(@"(\n\r){2,}"); 
foreach (string s in sc) 
{ 
    html = Regex.Replace(html, s, "", RegexOptions.IgnoreCase); 
} 
return html; 
}