10
votes

Comment puis-je supprimer HTML du texte dans .NET?

J'ai une page Web ASP.NET qui a une boîte TinyMCE. Les utilisateurs peuvent formater du texte et envoyer le code HTML à stocker dans une base de données.

sur le serveur, je voudrais prendre la bande HTML du texte afin que je puisse stocker uniquement le texte dans une colonne indexée du texte intégral pour la recherche.

C'est une brise de dépouiller le code HTML sur le client à l'aide de la fonction Text () de JQuery, mais je préférerais vraiment faire cela sur le serveur. Y a-t-il des utilitaires existants que je peux utiliser pour cela?

Modifier

Voir ma réponse.

Edit 2

Texte alt http://tinyurl.com/sillychimp


3 commentaires

Pourquoi utiliser TinyMCE si vous allez simplement supprimer tout le formatage ?!


Je stocke la TinyMCE générée HTML afin que je puisse présenter un texte formaté aux utilisateurs. Je vais stocker le texte dépouillé HTML dans une colonne différente pour la recherche de texte intégral. Je ne pense pas que ce soit une bonne idée d'index complet de texte / de recherche d'une colonne contenant une tonne de HTML. Je n'ai pas inclus ces détails dans la question initiale, car cela n'a rien à voir avec mon problème.


+1 pour me faire rire avec ce singe


9 Réponses :


8
votes

6 commentaires

Une meilleure idée serait d'utiliser un analyseur HTML.


Pourquoi si une simple regex fait le travail?


@mkoryak: Pourriez-vous s'il vous plaît expliquer pourquoi ce serait mieux?


Cela dépendra des balises mais laissez des entités html-codées, de sorte que ce n'est pas vraiment une réponse complète.


Pour ajouter à ce que Richardtallent a déclaré: HTML malformé peut briser une regex et la faire dépouiller les choses qu'elle ne devrait pas. Un analyseur HTML complet est conçu pour accueillir HTML malformé afin de ne pas perdre de données ou de gagner des données «supplémentaires».


Je pense que si vous avez une solution HTML malformée, une bonne solution serait corrigée avant de le stocker (HTML Tidy). Un HTML malformé peut casser votre mise en page, en fonction de l'endroit où vous l'affichez



0
votes

Vous pouvez utiliser quelque chose comme celui-ci

string strwithouthtmltag;    
strwithouthtmltag = Regex.Replace(strWithHTMLTags, "<[^>]*>", string.Empty)


0 commentaires

0
votes

Si vous ne stockez que du texte pour l'indexation, vous souhaitez probablement faire un peu plus que de supprimer simplement le code HTML, par exemple en ignorant les mots d'arrêt et en supprimant les mots plus courts que (dire) 3 caractères. Cependant, une simple balise et un strip-teaseur, j'ai écrit une fois que ceci:

    public static string StripTags(string value)
    {
        if (value == null)
            return string.Empty;

        string pattern = @"&.{1,8};";
        value = Regex.Replace(value, pattern, " ");
        pattern = @"<(.|\n)*?>";
        return Regex.Replace(value, pattern, string.Empty);
    }


0 commentaires

0
votes

vous pourriez:

  • Utilisez une textaree ancienne unie (style pour la hauteur / la largeur / la police / etc.) plutôt que TinyMCE.
  • Utilisez les options de configuration intégrées de TinyMCE pour dénuder HTML non désiré.
  • Utilisez htmldecode (regex.replace (mystring, "<[^>] +>", "")) sur le serveur.

0 commentaires

2
votes

Voici le lien de code Refactorme de Jeff Atwood pour son Sanitize HTML Méthode


1 commentaires

Et voici comment il équilibre les balises afin que vous ne vous retrouviez pas avec le contenu de l'utilisateur de quelqu'un clôturant une DIV sur votre page qu'il n'a pas ouvert: REFACTORMYCODE.COM/CODES/360-BALANCE-HTML-TAGS



13
votes

J'ai téléchargé le HTMLAGILLERPACK et créé cette fonction:

string StripHtml(string html)
{
    // create whitespace between html elements, so that words do not run together
    html = html.Replace(">","> ");

    // parse html
    var doc = new HtmlAgilityPack.HtmlDocument();   
    doc.LoadHtml(html);

    // strip html decoded text from html
    string text = HttpUtility.HtmlDecode(doc.DocumentNode.InnerText);   

    // replace all whitespace with a single space and remove leading and trailing whitespace
    return Regex.Replace(text, @"\s+", " ").Trim();
}


2 commentaires

Jetez un coup d'œil à Richardtallent Commenter votre réponse.


Je l'ai vu. Je pense que je vais juste coller avec les 5 lignes de code que j'ai écrites.



0
votes

Comme vous pouvez avoir mal formé HTML dans le système: beauxoup ou similaire pourrait être utilisé .

Il est écrit en python; Je ne suis pas sûr de savoir comment il pourrait être interfacé - à l'aide de la langue .NET Langue Ironpython?


0 commentaires

0
votes

Vous pouvez utiliser HTQL COM et interroger la source avec une requête: & tx;


0 commentaires

2
votes
system.text.RegularExpressions

3 commentaires

Regex n'est pas le choix idéal pour analyser la regex. Voir les commentaires à la réponse de Roothera, mais cela est à court de choses que vous avez mal formé HTML, Regex éliminera les mauvaises données.


@ psubsee2003 riothera est juste des liens vers une réponse qui recommande exactement la même regex; Un jour, ce lien mourra et nous aurons de la chance que cette réponse ait la regex dedans. C'est la meilleure réponse.


@Chrismoschini Je n'ai jamais dit que la réponse était meilleure. J'ai dit voir les commentaires sous cette réponse.