Как удалить все теги 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.