C# で文字列から HTML タグを除去する

Saad Aslam 2023年10月12日
  1. C# で正規表現を使用して文字列から HTML タグを削除する
  2. で HTML Agility Pack を使用して文字列から HTML タグを削除する
C# で文字列から HTML タグを除去する

この記事では、文字列内にどのタグが含まれているかを知らずに、文字列からすべての HTML タグを削除する方法を示します。

このタスクを実行する方法はたくさんありますが、すべてのタグを削除することを保証するものはありません。そのメソッドのいくつかを見ていきます。

C# で正規表現を使用して文字列から HTML タグを削除する

public static string StripHTML(string input) {
  return Regex.Replace(input, "<[a-zA-Z/].*?>", String.Empty);
}

この関数は文字列パラメーターを渡し、タグの署名が関数入力で指定されているため、regexReplace() 関数を使用してタグを削除します。

すべての場合に機能するわけではありませんが、ほとんどの場合は正常に機能しました。文字列入力からすべてのタグを削除するためのアルゴリズムを作成する必要があります。

で HTML Agility Pack を使用して文字列から HTML タグを削除する

もう 1つの解決策は、HTML Agility Packを使用することです。

internal static string RmvTags(string d) {
  if (string.IsNullOrEmpty(d))
    return string.Empty;

  var doc = new HtmlDocument();
  doc.LoadHtml(d);

  var accTags = new String[] { "strong", "em", "u" };
  var n = new Queue<HtmlNode>(doc.DocumentNode.SelectNodes("./*|./text()"));
  while (n.Count > 0) {
    var no = nodes.Dequeue();
    var pNo = no.ParentNode;

    if (!accTags.Contains(no.Name) && no.Name != "#text") {
      var cNo = no.SelectNodes("./*|./text()");

      if (cNo != null) {
        foreach (var c in cNo) {
          n.Enqueue(c);
          pNo.InsertBefore(c, no);
        }
      }
      pNo.RemoveChild(no);
    }
  }
  return doc.DocumentNode.InnerHtml;
}

これは、strongemu、および生のテキストノードを除いて正常に機能します。この関数は、d 変数のパラメーターとして文字列を取ります。

if(string.IsNullOrEmpty(d)) 行は、文字列がすでに空であるかどうかを確認してから、空の文字列を返します。

var doc = new HtmlDocument();
doc.LoadHtml(d);

これらのステートメントは、新しい HTML ドキュメントを作成し、データをドキュメントにロードします。これはすでに HTML タグ文字列であり、HTML パターンに従います。

var accTags = new String[] { "strong", "em", "u"}; 行は、許可されるタグを示します。要件に応じて、タグを変更、追加、または削除できます。

次に、while ループで、キューを使用してすべてのドキュメントノードを追加し、各ノードをデキューし、HTML タグを削除します。

このプロセスは、すべてのデータがサニタイズされるまで続き、その後、サニタイズされたテキストである HTML ドキュメントの内部 HTML が返されます。

前に述べたように、このタスクを達成するための厳格なルールや方法はありません。複数の方法があり、完全に信頼できる方法はありません。

このコードは、低データセットに対してテストされています。ユーザーの入力を信頼することはできません。

著者: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.

LinkedIn

関連記事 - Csharp String