Как удалить все теги HTML из строки, не зная, какие теги в ней?


123

Есть ли простой способ удалить все HTML-теги или ЛЮБОЙ HTML-код из строки?

Например:

string title = "<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)"

Вышеуказанное действительно должно быть:

"Чемпионат Халка Хогана по борьбе знаменитостей [Проект № 206010] (Реальность)"


Этот вопрос закрыт из-за дублирования, но предлагаемый ответ дается с использованием Html Agility Pack. Если вы хотите удалить html-теги без использования пакета Html Agility, вы можете сослаться на мой ответ здесь stackoverflow.com/a/30026043/2318354 . Кому-то может быть полезно
Dilip0165

6
Это не дубликат, например «HTML agility pack - удаление нежелательных тегов без удаления содержимого?» хочет сохранить некоторые теги (т.е. дать список действительных тегов, удалить остальные). Этот вопрос касается удаления ВСЕХ тегов. И я не могу использовать ответы на другие вопросы, так как я не собираюсь передавать список всех существующих тегов html.
Thierry_S

Взгляните на xidel . Это займет у вас 95% пути с xidel -s input -e '/'.
Джош Хабдас,

Ответы:


248

Вы можете использовать такое простое регулярное выражение:

public static string StripHTML(string input)
{
   return Regex.Replace(input, "<.*?>", String.Empty);
}

Имейте в виду, что у этого решения есть свой недостаток. См. Раздел Удаление тегов HTML в строке для получения дополнительной информации (особенно комментарии @mehaase)

Другое решение - использовать HTML Agility Pack .
Вы можете найти пример использования библиотеки здесь: HTML agility pack - удаление нежелательных тегов без удаления содержимого?


2
Не работает для ввода: «7 <10 <b> но </b> 30> 10», это дает: «7, но 30> 10»
Бартош Пьершлевич

Да, потому что он удаляет все между <и>, так что в вашем случае, < 10 <b>и </b>оба они удаляются.
Bidou

2
Разве имя метода не должно быть StripHtml (), поскольку имена методов должны использовать регистр Паскаля?
Дэвид Клемпфнер

Использование для этого регулярных выражений, вероятно, не является хорошей идеей, если вы используете это по соображениям безопасности.
Mathias Lykkegaard Lorenzen

3
Просто измените регулярное выражение на <[a-zA-Z /] *?>
Brandon Prudent

54

Вы можете проанализировать строку с помощью пакета Html Agility и получить InnerText.

    HtmlDocument htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(@"<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)");
    string result = htmlDoc.DocumentNode.InnerText;

Мне нравится InnerTextрешение, поскольку оно удаляет все теги. Но ... он оставляет, &nbsp;а также теги комментариев, такие как, <!-- xxx --> например, окружающие v:shapetype, v:shapeили v:imagedataс [if gte vml 1]или[if !vml]
Thierry_S

7
Я понимаю, что &nbsp;это html-объект, а не тег, поэтому решение для удаления этого может быть result = WebUtility.HtmlDecode(result);и для удаления узлов комментариев с помощью Html Agility Pack: htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());непосредственно перед тем, как сделатьresult = htmlDoc.DocumentNode.InnerText;
Thierry_S

3

Вы можете использовать приведенный ниже код в своей строке, и вы получите полную строку без части html.

string title = "<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)".Replace("&nbsp;",string.Empty);            
        string s = Regex.Replace(title, "<.*?>", String.Empty);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.