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

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

Пример:

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

Выход:

"Hello"

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

Ответы [ 13 ]

107 голосов
/ 24 апреля 2009

Если он просто извлекает все теги HTML из строки, это надежно работает и с регулярным выражением. Заменить:

<[^>]*(>|$)

с пустой строкой, глобально. Не забудьте потом нормализовать строку, заменив:

[\s\r\n]+

с одним пробелом и усечением результата. При необходимости замените любые объекты символов HTML обратно на действительные символы.

Примечание :

  1. Существует ограничение: HTML и XML допускают > в значениях атрибутов. Это решение будет возвращать сломанную разметку при обнаружении таких значений.
  2. Решение технически безопасно, как в: Результат никогда не будет содержать ничего, что можно было бы использовать для создания межсайтовых сценариев или для нарушения макета страницы. Просто не очень чисто.
  3. Как и все вещи HTML и регулярные выражения:
    Используйте правильный синтаксический анализатор , если вы должны сделать это правильно при любых обстоятельствах.
72 голосов
/ 15 мая 2009

Перейти скачать HTMLAgilityPack, сейчас! ;) Скачать LInk

Это позволяет загружать и анализировать HTML. Затем вы можете перемещаться по DOM и извлекать внутренние значения всех атрибутов. Серьезно, это займет у вас максимум 10 строк кода. Это одна из величайших бесплатных библиотек .net.

Вот пример:

            string htmlContents = new System.IO.StreamReader(resultsStream,Encoding.UTF8,true).ReadToEnd();

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(htmlContents);
            if (doc == null) return null;

            string output = "";
            foreach (var node in doc.DocumentNode.ChildNodes)
            {
                output += node.InnerText;
            }
64 голосов
/ 24 апреля 2009
Regex.Replace(htmlText, "<.*?>", string.Empty);
11 голосов
/ 02 марта 2012
protected string StripHtml(string Txt)
{
    return Regex.Replace(Txt, "<(.|\\n)*?>", string.Empty);
}    

Protected Function StripHtml(Txt as String) as String
    Return Regex.Replace(Txt, "<(.|\n)*?>", String.Empty)
End Function
6 голосов
/ 05 ноября 2009

Я разместил это на форумах asp.net, и, похоже, это одно из самых простых решений. Я не гарантирую, что он самый быстрый или самый эффективный, но он довольно надежный. В .NET вы можете использовать сами объекты HTML Web Control. Все, что вам действительно нужно сделать, это вставить вашу строку во временный объект HTML, такой как DIV, а затем использовать встроенный InnerText, чтобы захватить весь текст, который не содержится в тегах. Ниже приведен простой пример C #:


System.Web.UI.HtmlControls.HtmlGenericControl htmlDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
htmlDiv.InnerHtml = htmlString;
String plainText = htmlDiv.InnerText;
5 голосов
/ 24 апреля 2009

Я написал довольно быстрый метод на c #, который чертовски превосходит Regex. Он размещен в статье на CodeProject.

К его преимуществам, помимо повышения производительности, относится возможность замены именованных и пронумерованных сущностей HTML (таких как &amp;amp; и &203;), замена блоков комментариев и т. Д.

Пожалуйста, прочитайте связанную статью о CodeProject .

Спасибо.

4 голосов
/ 05 ноября 2012

Для тех из вас, кто не может использовать HtmlAgilityPack, читатель XML .NETs является опцией. Это может не сработать в хорошо отформатированном HTML, хотя всегда добавляйте в качестве резервной копии уловку с помощью regx. Обратите внимание, что это НЕ быстро, но предоставляет хорошую возможность для отладки старой школы.

public static string RemoveHTMLTags(string content)
    {
        var cleaned = string.Empty;
        try
        {
            StringBuilder textOnly = new StringBuilder();
            using (var reader = XmlNodeReader.Create(new System.IO.StringReader("<xml>" + content + "</xml>")))
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Text)
                        textOnly.Append(reader.ReadContentAsString());
                }
            }
            cleaned = textOnly.ToString();
        }
        catch
        {
            //A tag is probably not closed. fallback to regex string clean.
            string textOnly = string.Empty;
            Regex tagRemove = new Regex(@"<[^>]*(>|$)");
            Regex compressSpaces = new Regex(@"[\s\r\n]+");
            textOnly = tagRemove.Replace(content, string.Empty);
            textOnly = compressSpaces.Replace(textOnly, " ");
            cleaned = textOnly;
        }

        return cleaned;
    }
3 голосов
/ 15 мая 2009
string result = Regex.Replace(anytext, @"<(.|\n)*?>", string.Empty);
1 голос
/ 18 ноября 2013

Для тех, кто пытается понять, что решение Майкла Типтопа не работает, вот .Net4 + способ сделать это:

public static string StripTags(this string markup)
{
    try
    {
        StringReader sr = new StringReader(markup);
        XPathDocument doc;
        using (XmlReader xr = XmlReader.Create(sr,
                           new XmlReaderSettings()
                           {
                               ConformanceLevel = ConformanceLevel.Fragment
                               // for multiple roots
                           }))
        {
            doc = new XPathDocument(xr);
        }

        return doc.CreateNavigator().Value; // .Value is similar to .InnerText of  
                                           //  XmlDocument or JavaScript's innerText
    }
    catch
    {
        return string.Empty;
    }
}
0 голосов
/ 17 марта 2017
using System.Text.RegularExpressions;

string str = Regex.Replace(HttpUtility.HtmlDecode(HTMLString), "<.*?>", string.Empty);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...