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