2018.02.08 15:28
개요

개발을 진행하다 보면 문자열에서 HTML 관련 태그를 모두 삭제하고자 하는 경우가 있다.
HTML 내용에는 예외 상황이 많기 때문에 정규식으로 완벽히 지우기는 어렵긴 하다.
그래서 공통 코드로 하나 만들어 보았다.

개발

public class HtmlUtils {
  private enum HtmlTagPatterns {
    SCRIPTS("<(no)?script[^>]*>.*?</(no)?script>", Pattern.DOTALL),
    STYLE("<style[^>]*>.*</style>", Pattern.DOTALL),
    TAGS("<([a-zA-Z!-:]+[^>]+|[a-zA-Z!-:]+)>"),
    N_TAGS("<\\w+\\s+[^<]*\\s*>"),
    ENTITY_REFS("&[^;]+;"),
    WHITESPACE("\\s\\s+");

    private Pattern pattern;

    public static HtmlTagPatterns[] COMMON = {
      SCRIPTS, STYLE, TAGS, N_TAGS, ENTITY_REFS
    };

    private HtmlTagPatterns(String regex) {
      this.pattern = Pattern.compile(regex);
    }

    private HtmlTagPatterns(String regex, int flags) {
      this.pattern = Pattern.compile(regex, flags);
    }

    public Pattern getPattern() {
      return pattern;
    }
  }

  public static String removeTag(String html) {
    return removeTag(html, HtmlTagPatterns.values());
  }

  public static String removeTag(String html, HtmlTagPatterns... patterns) {
    if (StringUtils.isEmpty(html) || ArrayUtils.isEmpty(patterns)) {
      return html;
    }

    for (HtmlTagPatterns tagPattern : patterns) {
      html = tagPattern.getPattern().matcher(html).replaceAll("");
    }

    return html;
  }
}
HtmlTagPatterns 에 케이스별로 정규식을 정리했고, 원하는 케이스만 지울 수 있도록 하였다.
COMMON 처럼 보통 사용하는 Patterns 모음을 만들어 두기도 했다.
COMMON에는 Whitespace를 제거하지 않는데, Whitespace를 추가하면 줄바꿈 정보까지 지워질 수 있기 때문이다.

이를 기반으로 정규식을 적절히 조절하면 다양한 케이스를 대응할 수 있을 것 같다. 


Posted by 마이너 Tomining