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. P>
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. P>
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? P>
Voir ma réponse. P>
9 Réponses :
Jetez un oeil à ce Strip Tags HTML d'une chaîne en utilisant des expressions régulières P>
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
Vous pouvez utiliser quelque chose comme celui-ci
string strwithouthtmltag; strwithouthtmltag = Regex.Replace(strWithHTMLTags, "<[^>]*>", string.Empty)
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);
}
vous pourriez: p>
Voici le lien de code Refactorme de Jeff Atwood pour son Sanitize HTML Méthode P>
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
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();
}
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.
Comme vous pouvez avoir mal formé HTML dans le système: beauxoup ou similaire pourrait être utilisé . p>
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? P>
Vous pouvez utiliser HTQL COM et interroger la source avec une requête:
system.text.RegularExpressions
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.
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