Как я могу удалить теги HTML из строки в ASP.NET? - PullRequest
120 голосов
/ 24 апреля 2009

Используя ASP.NET, как я могу надежно удалить теги HTML из заданной строки (т.е. без использования регулярных выражений)? Я ищу что-то вроде PHP strip_tags.

Пример:

<ul><li>Hello</li></ul>

Выход:

"Hello"

Я стараюсь не изобретать велосипед, но пока не нашел ничего, что отвечало бы моим потребностям.

Ответы [ 13 ]

0 голосов
/ 07 апреля 2016

Для второго параметра, т.е. сохраните некоторые теги, вам может понадобиться такой код, используя HTMLagilityPack:

public string StripTags(HtmlNode documentNode, IList keepTags)
{
    var result = new StringBuilder();
        foreach (var childNode in documentNode.ChildNodes)
        {
            if (childNode.Name.ToLower() == "#text")
            {
                result.Append(childNode.InnerText);
            }
            else
            {
                if (!keepTags.Contains(childNode.Name.ToLower()))
                {
                    result.Append(StripTags(childNode, keepTags));
                }
                else
                {
                    result.Append(childNode.OuterHtml.Replace(childNode.InnerHtml, StripTags(childNode, keepTags)));
                }
            }
        }
        return result.ToString();
    }

Больше объяснений на этой странице: http://nalgorithm.com/2015/11/20/strip-html-tags-of-an-html-in-c-strip_html-php-equivalent/

0 голосов
/ 28 мая 2015

Я посмотрел на предлагаемые здесь решения на основе Regex, и они не внушают мне никакой уверенности, за исключением самых тривиальных случаев. Угловая скобка в атрибуте - это все, что нужно для разрыва, не говоря уже о неправильном HTML-коде. А как насчет сущностей типа &amp;? Если вы хотите преобразовать HTML в простой текст, вам также необходимо декодировать сущности.

Поэтому я предлагаю метод ниже.

Используя HtmlAgilityPack , этот метод расширения эффективно удаляет все теги HTML из фрагмента html. Также декодирует HTML-объекты, такие как &amp;. Возвращает только внутренние текстовые элементы с новой строкой между каждым текстовым элементом.

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-странице ( > становится &gt; и т. Д.).

0 голосов
/ 15 мая 2014

Просто используйте string.StripHTML();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...