116 votes

Comment convertir du Html en texte brut ?

J'ai des extraits de Html stockés dans une table. Pas de pages entières, pas de balises ou autres, juste un formatage de base.

J'aimerais pouvoir afficher ce Html sous forme de texte uniquement, pas de formatage sur une page donnée (en fait, seulement les 30 à 50 premiers caractères, mais c'est la partie la plus facile).

Comment puis-je placer le "texte" de ce Html dans une chaîne de caractères sous forme de texte pur ?

Donc ce morceau de code.

<b>Hello World.</b><br/><p><i>Is there anyone out there?</i><p>

Devient :

Bonjour le monde. Y a-t-il quelqu'un ici ?

108voto

Judah Himango Points 27365

La source libre et ouverte HtmlAgilityPack a dans l'un de ses échantillons une méthode qui convertit le HTML en texte brut.

var plainText = ConvertToPlainText(string html);

Donnez-lui une chaîne HTML comme

<b>Bonjour le monde!</b><br> <i><i>C'est moi ! !</i>

Et vous obtiendrez un résultat en texte brut comme :

hello world!
it is me!

60voto

Ben Anderson Points 1454

Je ne pouvais pas utiliser HtmlAgilityPack, alors j'ai écrit une deuxième meilleure solution pour moi-même

private static string HtmlToPlainText(string html)
{
    const string tagWhiteSpace = @"(>|$)(\W|\n|\r)+<";//matches one or more (white space or line breaks) between '>' and '<'
    const string stripFormatting = @"<[^>]*(>|$)";//match any character between '<' and '>', even when end tag is missing
    const string lineBreak = @"<(br|BR)\s{0,1}\/{0,1}>";//matches: <br>,<br/>,<br />,<BR>,<BR/>,<BR />
    var lineBreakRegex = new Regex(lineBreak, RegexOptions.Multiline);
    var stripFormattingRegex = new Regex(stripFormatting, RegexOptions.Multiline);
    var tagWhiteSpaceRegex = new Regex(tagWhiteSpace, RegexOptions.Multiline);

    var text = html;
    //Decode html specific characters
    text = System.Net.WebUtility.HtmlDecode(text); 
    //Remove tag whitespace/line breaks
    text = tagWhiteSpaceRegex.Replace(text, "><");
    //Replace <br /> with line breaks
    text = lineBreakRegex.Replace(text, Environment.NewLine);
    //Strip formatting
    text = stripFormattingRegex.Replace(text, string.Empty);

    return text;
}

29voto

vfilby Points 5975

Si vous parlez de décapage d'étiquettes, c'est relativement simple si vous n'avez pas à vous soucier de choses telles que <script> tags. Si tout ce dont vous avez besoin est d'afficher le texte sans les balises, vous pouvez le faire avec une expression régulière :

<[^>]*>

Si vous devez vous inquiéter de <script> et autres, vous aurez besoin de quelque chose d'un peu plus puissant que les expressions régulières car vous devez suivre l'état, quelque chose qui ressemble plus à une grammaire libre de contexte (CFG). Bien que vous puissiez être en mesure de le faire avec une correspondance "de gauche à droite" ou sans avarice.

Si vous savez utiliser les expressions régulières, il existe de nombreuses pages Web contenant des informations utiles :

Si vous avez besoin du comportement plus complexe d'un CFG, je vous suggère d'utiliser un outil tiers, malheureusement je n'en connais pas de bon à recommander.

20voto

George Stocker Points 31258

HTTPUTility.HTMLEncode() est destiné à gérer l'encodage des balises HTML en tant que chaînes de caractères. Il s'occupe de toutes les tâches difficiles pour vous. De la Documentation MSDN :

Si des caractères tels que des blancs et des signes de ponctuation sont transmis dans un flux HTTP, ils peuvent être mal interprétés par le destinataire. Le codage HTML convertit les caractères qui ne sont pas autorisés en HTML en équivalents de type entité de caractère ; le décodage HTML inverse le codage. Par exemple, lorsqu'ils sont intégrés dans un bloc de texte, les caractères < et > sont codés comme &lt; et &gt; pour la transmission HTTP.

HTTPUtility.HTMLEncode() méthode, détaillée ici :

public static void HtmlEncode(
string s,
TextWriter output
)

Utilisation :

String TestString = "This is a <Test String>.";
StringWriter writer = new StringWriter();
Server.HtmlEncode(TestString, writer);
String EncodedString = writer.ToString();

J'espère que cela vous aidera.

8voto

WEFX Points 2942

Pour compléter la réponse de vfilby, vous pouvez simplement effectuer un remplacement RegEx dans votre code ; aucune nouvelle classe n'est nécessaire. Au cas où d'autres débutants comme moi tomberaient sur cette question.

using System.Text.RegularExpressions;

Alors...

private string StripHtml(string source)
{
        string output;

        //get rid of HTML tags
        output = Regex.Replace(source, "<[^>]*>", string.Empty);

        //get rid of multiple blank lines
        output = Regex.Replace(output, @"^\s*$\n", string.Empty, RegexOptions.Multiline);

        return output;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X