Як видалити всі теги HTML із рядка, не знаючи, які теги в ньому?


122

Чи є простий спосіб видалити всі 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;)"

Сказане дійсно повинно бути:

"Чемпіонат Хелк Хоган з боротьби зі знаменитістю [Proj # 206010] (Серія реаліті)"


Це запитання закрито через дублювання, але запропонована відповідь дається за допомогою програми Html Agility Pack. Якщо ви хочете видалити html-теги за допомогою пакету Html Agility, ви можете надіслати мою відповідь тут stackoverflow.com/a/30026043/2318354 . Що може бути корисним для когось
Dilip0165

6
Це не дублікат, оскільки "пакет спритності HTML - видалення небажаних тегів без видалення вмісту?" хоче зберегти деякі теги (тобто дати список дійсних тегів, видалити решту). Це питання стосується видалення ВСІХ тегів. І я не можу використовувати відповіді на інше питання, оскільки я не збираюся переходити до списку всіх існуючих HTML-тегів.
Thierry_S

Погляньте на ксидель . Це забере у вас 95% шляху туди xidel -s input -e '/'.
Джош Хабдас

Відповіді:


246

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

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

Майте на увазі, що це рішення має свою ваду. Для отримання додаткової інформації див. Видалення тегів HTML у String (особливо коментарі @mehaase)

Іншим рішенням буде використання пакету HTML Agility .
Ви можете знайти приклад за допомогою бібліотеки тут: Пакет спритності HTML - видалення небажаних тегів без видалення вмісту?


2
Не працює для введення даних: '7 <10 <b> але </b> 30> 10' дає: '7, але 30> 10'
Bartosz Pierzchlewicz

Так, тому що він знімає все між <і>, так і у вашому випадку, < 10 <b>і </b>вони обидва позбавлені.
Біду

2
Чи не повинно ім'я методу бути StripHtml (), оскільки імена методів повинні використовувати регістр Pascal?
Девід Клемффнер

Використання регулярних виразів для цього, мабуть, не є хорошою ідеєю, якщо ви використовуєте його з міркувань безпеки.
Mathias Lykkegaard Lorenzen

3
Просто змініть регулярний вираз на <[a-zA-Z /] *?>
Брендон Прудент

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: 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.