[C#] Regex, HTML 태그 정리할 때에 일부 태그가 정리 안 되는 현상 수정 방법

Regex를 사용하여 html 태그를 정리하려고 하는데요, 예시는 span 태그를 기준으로 안내해 드리려고 해요.

일부 span 태그가 정리가 이상하게 되어 확인을 해보았더니, replace 코드에서 <span><span></span></span>과 같은 중첩된 태그의 처리가 제대로 되지 않는 부분을 발견하였습니다.

정규 표현식은 보통 중첩 구조를 다루는 데 적합하지 않기 때문에, 작성한 코드가 정규 표현식이 중첩된 태그 구조를 놓친 것이지요. 😭

외부 라이브러리가 아닌 내부 정규 표현식으로 해결하려면, 더 복잡한 표현식을 사용하거나 반복적으로 여러 번 태그를 제거하는 방식을 시도할 수 있어요.

정규 표현식을 계속 사용하고자 할 경우, 다음과 같은 방법을 사용해볼 수 있습니다.

  1. 중첩 태그가 여러 번 있는 상황을 고려하여, 단계적으로 태그를 제거합니다.
  2. 중첩된 span을 처리할 때 모든 태그를 처리하는 것이 아니라, 외부 span 태그부터 순차적으로 처리하는 방법을 사용할 수 있습니다.

단계별 접근 방식

  1. 중첩된 <span> 태그 처리: 먼저 모든 <span> 태그를 일괄적으로 제거하는 방법을 사용합니다. 그 후, 결과 문자열에서 남은 텍스트만 추출합니다.
  2. 반복적으로 적용: 여러 번 replace를 수행하여 모든 중첩을 제거합니다.

코드 예시

아래는 C#에서 중첩된 <span> 태그를 처리하기 위한 정규 표현식 예시입니다:
using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string input = "input";

        // 중첩된 span 태그를 처리하는 정규 표현식
        string pattern = @"<span[^>]*?>(.*?)<\/span>";
        string output = input;

        // 모든 중첩 태그 제거할 때까지 반복
        while (Regex.IsMatch(output, pattern))
        {
            output = Regex.Replace(output, pattern, "$1");
        }

        Console.WriteLine(output);
    }
}

설명

  • 정규 표현식: @"<span[^>]*?>(.*?)<\/span>"<span> 태그를 찾고 해당 태그의 내용을 $1로 대체합니다. 여기서 $1은 캡처된 그룹의 내용을 의미해요.
  • 반복 구조: while 루프를 사용하여 더 이상 <span> 태그가 없는 경우까지 반복적으로 정규 표현식을 적용해요.
  • 출력 결과: 위 코드를 실행하면 모든 중첩된 <span> 태그가 제거되고, 해당 태그 안의 내용만 남아요.

이 방법을 통해 중첩된 <span> 태그를 정규 표현식으로 효과적으로 처리할 수 있어요. 중첩 구조의 깊이에 따라 실행 시간이 증가할 수 있지만, 필요한 경우 반복적으로 적용하여 모든 태그를 제거할 수 있을 거예요.

이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗