Я розглянув запропоновані тут рішення на основі Regex, і вони не наповнюють мене впевненістю, за винятком самих тривіальних випадків. Кутова дужка в атрибуті - це все, що потрібно, щоб зламати, не кажучи вже про неправильно сформований HTML з дикої природи. А як щодо утворень, як& ? Якщо ви хочете перетворити HTML в звичайний текст, вам також потрібно розшифрувати об'єкти.
Тому я пропоную метод нижче.
Використовуючи HtmlAgilityPack , цей метод розширення ефективно знімає всі теги HTML з фрагмента html. Також декодує HTML-об'єкти, як &. Повертає лише внутрішні текстові елементи з новим рядком між кожним текстовим елементом.
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();
}
Якщо ви дійсно серйозно, ви хочете ігнорувати вміст певного HTML тегів теж ( <script>, <style>, <svg>, <head>,<object> приходять на розум!) , Тому що вони , ймовірно , не містять читане зміст в тому сенсі , ми після. Що ви там робите, буде залежати від ваших обставин та того, наскільки далеко ви хочете піти, але використання HtmlAgilityPack було б досить тривіально для білих списків або вибраних тегів у чорний список.
Якщо ви рендерируете вміст на сторінку HTML, переконайтеся, що ви розумієте вразливість XSS та як її запобігти - тобто завжди кодуйте будь-який введений користувачем текст, який повертається на HTML-сторінку ( >стає >і т.д.).