Przyjrzałem się proponowanym tutaj rozwiązaniom opartym na Regex i nie dają mi one pewności, z wyjątkiem najbardziej banalnych przypadków. Do złamania wystarczy nawias ostry w atrybucie, nie mówiąc już o nieprawidłowo sformatowanym HTML z „dzikiego”. A co z takimi bytami &
? Jeśli chcesz przekonwertować HTML na zwykły tekst, musisz również zdekodować jednostki.
Dlatego proponuję poniższą metodę.
Korzystając z HtmlAgilityPack , ta metoda rozszerzenia skutecznie usuwa wszystkie tagi HTML z fragmentu HTML. Dekoduje również jednostki HTML, takie jak &
. Zwraca tylko wewnętrzne elementy tekstowe, z nowym wierszem między każdym elementem tekstowym.
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();
}
Jeśli jesteś naprawdę poważne, że chcesz, aby zignorować zawartości niektórych tagów HTML zbyt ( <script>
, <style>
, <svg>
, <head>
, <object>
przychodzą do głowy!), Ponieważ prawdopodobnie nie zawierają treści czytelne w tym sensie jesteśmy po. To, co tam zrobisz, będzie zależeć od twoich okoliczności i tego, jak daleko chcesz się posunąć, ale używając HtmlAgilityPack byłoby dość trywialne dodanie do białej lub czarnej listy wybranych tagów.
Jeśli renderujesz treść z powrotem na stronę HTML, upewnij się, że rozumiesz lukę w zabezpieczeniach XSS i jak temu zapobiec - tj. Zawsze koduj tekst wprowadzony przez użytkownika, który jest renderowany z powrotem na stronie HTML ( >
staje się >
itd.).