C#의 문자열에서 HTML 태그 제거

Saad Aslam 2023년10월12일
  1. 정규식을 사용하여 C#의 문자열에서 HTML 태그 제거
  2. HTML Agility Pack을 사용하여 C#의 문자열에서 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을 사용하여 C#의 문자열에서 HTML 태그 제거

또 다른 해결책은 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;
}

이것은 strong, em, u 및 원시 텍스트 노드를 제외하고는 잘 작동합니다. 이 함수는 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