どのタグが含まれているかを知らずに、文字列からすべてのHTMLタグを削除するにはどうすればよいですか?


121

文字列からすべての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タグを削除したい場合は、ここに私の答えを参照することができますパックstackoverflow.com/a/30026043/2318354を。誰かに役立つかもしれません
Dilip0165

6
「HTMLアジリティパック-コンテンツを削除せずに不要なタグを削除しますか?」のように、これは重複ではありません。一部のタグを保持したい(つまり、有効なタグのリストを提供し、残りを削除する)。ここでのこの質問は、すべてのタグの削除についてです。また、存在するすべてのhtmlタグのリストを渡さないため、他の質問の回答を使用することはできません。
Thierry_S 2017年

xidelを見てください。そこまでの道の95%がになりますxidel -s input -e '/'
Josh Habdas

回答:


244

次のような単純な正規表現を使用できます。

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

このソリューションには独自の欠陥があることに注意してください。詳細については、文字列内のHTMLタグ削除する(特に@mehaaseのコメント)を参照してください。

別の解決策は、HTML Agility Packを使用することです。
ここでライブラリを使用した例を見つけることができます:HTMLアジリティパック-コンテンツを削除せずに不要なタグを削除しますか?


2
入力に対しては機能しません: '7 <10 <b> but </ b> 30> 10'とすると、次のようになります: '7 but 30> 10'
Bartosz Pierzchlewicz

はい、それはので、あなたの場合には、間の<と>のすべてを取り除きので、< 10 <b></b>の両方削除されます。
Bidou

2
メソッド名はPascalの大文字小文字を使用する必要があるため、メソッド名はStripHtml()にすべきではありませんか?
David Klempfner

セキュリティ上の理由から正規表現を使用している場合は、正規表現を使用することはお勧めできません。
Mathias Lykkegaard Lorenzen 2018

3
正規表現を<[a-zA-Z /] *?>に変更するだけ
Brandon Prudent 2018年

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:shapetypev: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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.