2013-10-22 12 views
72

Wie kann ich alle HTML-Tags einschließlich & nbsp mit Regex in C# entfernen. Mein String sieht aus wieEntfernen Sie HTML-Tags aus Zeichenfolge einschließlich & Nbsp in C#

"<div>hello</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div>" 
+9

Sie einen regulären Ausdruck nicht verwenden, die HTML Agility Pack-Check-out. http://stackoverflow.com/questions/846994/how-to-use-html-agility-pack – Tim

+0

Danke Tim, aber die Anwendung ist ziemlich groß und intakt, Hinzufügen oder Herunterladen eines HTML-Agility-Pack wird nicht funktionieren. – rampuriyaaa

Antwort

172

Wenn Sie keinen HTML-Parser verwenden können orientierte Lösung, um die Tags herauszufiltern, hier ist eine einfache Regex dafür.

string noHTML = Regex.Replace(inputHTML, @"<[^>]+>|&nbsp;", "").Trim(); 

Sie sollten idealerweise einen weiteren Durchgang durch einen Regex Filter machen, die sich um mehrere Räume nimmt als

string noHTMLNormalised = Regex.Replace(noHTML, @"\s{2,}", " "); 
+0

Ich habe das noch nicht so viel getestet wie ich brauche, aber es hat besser funktioniert, als ich erwartet hatte. Ich werde die Methode posten, die ich unten geschrieben habe. –

+0

Ein faules Match ('<[^>] +?>' Laut @David S.) könnte das ein bisschen schneller machen, aber nur diese Lösung in einem Live-Projekt verwenden - sehr glücklich +1 :) –

+0

Regex.Replace (inputHTML, @ "<[^>] +> | & nbsp | \ n;", "") .Trim(); \ n wird nicht entfernt –

0

dies:

(<.+?> | &nbsp;) 

jeden Tag oder &nbsp;

string regex = @"(<.+?>|&nbsp;)"; 
var x = Regex.Replace(originalString, regex, "").Trim(); 

dann übereinstimmen x = hello

14

Ich habe eine Zeit lang diese Funktion verwenden. Entfernt so ziemlich jeden chaotischen HTML-Code, den Sie darauf werfen können, und lässt den Text intakt.

 private static readonly Regex _tags_ = new Regex(@"<[^>]+?>", RegexOptions.Multiline | RegexOptions.Compiled); 

     //add characters that are should not be removed to this regex 
     private static readonly Regex _notOkCharacter_ = new Regex(@"[^\w;&#@.:/\\?=|%!() -]", RegexOptions.Compiled); 

     public static String UnHtml(String html) 
     { 
      html = HttpUtility.UrlDecode(html); 
      html = HttpUtility.HtmlDecode(html); 

      html = RemoveTag(html, "<!--", "-->"); 
      html = RemoveTag(html, "<script", "</script>"); 
      html = RemoveTag(html, "<style", "</style>"); 

      //replace matches of these regexes with space 
      html = _tags_.Replace(html, " "); 
      html = _notOkCharacter_.Replace(html, " "); 
      html = SingleSpacedTrim(html); 

      return html; 
     } 

     private static String RemoveTag(String html, String startTag, String endTag) 
     { 
      Boolean bAgain; 
      do 
      { 
       bAgain = false; 
       Int32 startTagPos = html.IndexOf(startTag, 0, StringComparison.CurrentCultureIgnoreCase); 
       if (startTagPos < 0) 
        continue; 
       Int32 endTagPos = html.IndexOf(endTag, startTagPos + 1, StringComparison.CurrentCultureIgnoreCase); 
       if (endTagPos <= startTagPos) 
        continue; 
       html = html.Remove(startTagPos, endTagPos - startTagPos + endTag.Length); 
       bAgain = true; 
      } while (bAgain); 
      return html; 
     } 

     private static String SingleSpacedTrim(String inString) 
     { 
      StringBuilder sb = new StringBuilder(); 
      Boolean inBlanks = false; 
      foreach (Char c in inString) 
      { 
       switch (c) 
       { 
        case '\r': 
        case '\n': 
        case '\t': 
        case ' ': 
         if (!inBlanks) 
         { 
          inBlanks = true; 
          sb.Append(' '); 
         } 
         continue; 
        default: 
         inBlanks = false; 
         sb.Append(c); 
         break; 
       } 
      } 
      return sb.ToString().Trim(); 
     } 
+0

Nur zur Bestätigung: Die Funktion SingleSpacedTrim() macht dasselbe wie String noHTMLNormalised = Regex.Replace (noHTML, @ "\ s {2,}", ""); von Ravi Thapliyals Antwort? – Jimmy

+0

@Jimmy Soweit ich sehen kann, fängt diese Regex nicht einzelne Tabulatoren oder Zeilenumbrüche wie SingleSpacedTrim(). Dies könnte jedoch ein wünschenswerter Effekt sein, in diesem Fall entfernen Sie einfach die Fälle nach Bedarf. –

+0

Schön, aber es scheint einfache und doppelte Anführungszeichen auch durch Leerzeichen zu ersetzen, obwohl sie nicht in der "_notOkCharacter_" -Liste sind, oder fehlt mir da etwas? Wird dieser Teil der Dekodierung/Kodierung am Anfang genannt? Was wäre notwendig, um diese Zeichen intakt zu halten? – vm370

3
var noHtml = Regex.Replace(inputHTML, @"<[^>]*(>|$)|&nbsp;|&zwnj;|&raquo;|&laquo;", string.Empty).Trim(); 
28

Ich habe Code des @Ravi Thapliyal und machte eine Methode: Es ist einfach und vielleicht nicht alles sauber, aber so weit ist es zu tun, was ich tun muss.

public static string ScrubHtml(string value) { 
    var step1 = Regex.Replace(value, @"<[^>]+>|&nbsp;", "").Trim(); 
    var step2 = Regex.Replace(step1, @"\s{2,}", " "); 
    return step2; 
} 
Verwandte Themen