Ho esaminato le soluzioni basate su Regex suggerite qui e non mi danno alcuna fiducia tranne nei casi più banali. Una parentesi angolare in un attributo è tutto ciò che serve per rompere, per non parlare dell'HTML mal formato dal selvaggio. E per quanto riguarda le entità come&
? Se vuoi convertire l'HTML in testo normale, devi decodificare anche le entità.
Quindi propongo il metodo di seguito.
Utilizzando HtmlAgilityPack , questo metodo di estensione rimuove in modo efficiente tutti i tag HTML da un frammento html. Decodifica anche entità HTML come &
. Restituisce solo gli elementi di testo interni, con una nuova riga tra ogni elemento di testo.
public static string RemoveHtmlTags(this string html)
{
if (String.IsNullOrEmpty(html))
return html;
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
{
return WebUtility.HtmlDecode(html);
}
var sb = new StringBuilder();
var i = 0;
foreach (var node in doc.DocumentNode.ChildNodes)
{
var text = node.InnerText.SafeTrim();
if (!String.IsNullOrEmpty(text))
{
sb.Append(text);
if (i < doc.DocumentNode.ChildNodes.Count - 1)
{
sb.Append(Environment.NewLine);
}
}
i++;
}
var result = sb.ToString();
return WebUtility.HtmlDecode(result);
}
public static string SafeTrim(this string str)
{
if (str == null)
return null;
return str.Trim();
}
Se siete veramente serio, che ci si vuole ignorare il contenuto dei tag HTML certo troppo ( <script>
, <style>
, <svg>
, <head>
,<object>
vengono in mente!), Perché probabilmente non contengono contenuti leggibili nel senso ci sono dopo. Quello che farai dipenderà dalle tue circostanze e da quanto lontano vuoi andare, ma usando HtmlAgilityPack sarebbe piuttosto banale inserire nella whitelist o nella blacklist i tag selezionati.
Se stai restituendo il contenuto in una pagina HTML, assicurati di aver compreso la vulnerabilità XSS e come prevenirla, ovvero codifica sempre qualsiasi testo inserito dall'utente che viene restituito su una pagina HTML ( >
diventa >
ecc.).