Я посмотрел на предлагаемые здесь решения на основе 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-странице ( >
становится >
и т. Д.).