[java] 문자열에서 HTML 태그 제거

Java 문자열에서 HTML을 제거하는 좋은 방법이 있습니까? 간단한 정규식

 replaceAll("\\<.*?>","") 

작동하지만 &amp;두 개의 꺾쇠 괄호 사이에 HTML이 아닌 것과 같은 것이 올바르게 변환되지 않습니다 (즉 .*?, 정규 표현식에서가 사라집니다).



답변

정규식 대신 HTML 파서를 사용하십시오. 이것은 Jsoup으로 간단 합니다.

public static String html2text(String html) {
    return Jsoup.parse(html).text();
}

Jsoup은 또한 사용자 정의 가능한 화이트리스트에 대한 HTML 태그 제거 를 지원합니다 . 예를 들어 <b>, <i>및 을 허용하려는 경우 매우 유용합니다 <u>.

또한보십시오:


답변

Android 용으로 작성 하는 경우이 작업을 수행 할 수 있습니다.

android.text.Html.fromHtml(instruction).toString()


답변

사용자가 입력 <b>hey!</b>하면 <b>hey!</b>또는 을 표시 hey!하시겠습니까? 첫 번째 경우보다 작고 이스케이프 처리하고 앰퍼샌드 (및 선택적으로 따옴표)를 html로 인코딩하면 괜찮습니다. 두 번째 옵션을 구현하기 위해 코드를 수정하면 다음과 같습니다.

replaceAll("\\<[^>]*>","")

그러나 사용자가와 같이 잘못된 것을 입력하면 문제가 발생합니다 <bhey!</b>.

“dirty”html 입력을 구문 분석하고 텍스트를 유지하면서 태그를 제거하는 방법을 제공 하는 JTidy 를 확인할 수도 있습니다 .

html을 제거하려고 할 때의 문제는 브라우저에 매우 관대 한 파서가 있고 찾을 수있는 라이브러리보다 관대하다는 것입니다. 따라서 모든 태그를 제거하는 것이 최선이더라도 (위의 replace 메소드, DOM 라이브러리 또는 JTidy 사용) 당신은 것입니다 여전히 귀하의 출력 안전을 유지하기 위해 남아있는 HTML 특수 문자를 인코딩 할 수 있는지 확인해야합니다.


답변

다른 방법은 javax.swing.text.html.HTMLEditorKit 를 사용하여 텍스트를 추출하는 것입니다.

import java.io.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;

public class Html2Text extends HTMLEditorKit.ParserCallback {
    StringBuffer s;

    public Html2Text() {
    }

    public void parse(Reader in) throws IOException {
        s = new StringBuffer();
        ParserDelegator delegator = new ParserDelegator();
        // the third parameter is TRUE to ignore charset directive
        delegator.parse(in, this, Boolean.TRUE);
    }

    public void handleText(char[] text, int pos) {
        s.append(text);
    }

    public String getText() {
        return s.toString();
    }

    public static void main(String[] args) {
        try {
            // the HTML to convert
            FileReader in = new FileReader("java-new.html");
            Html2Text parser = new Html2Text();
            parser.parse(in);
            in.close();
            System.out.println(parser.getText());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ref : 파일에서 HTML 태그를 제거하여 TEXT 만 추출


답변

html 태그를 필터링하는 가장 간단한 방법은 다음과 같습니다.

private static final Pattern REMOVE_TAGS = Pattern.compile("<.+?>");

public static String removeTags(String string) {
    if (string == null || string.length() == 0) {
        return string;
    }

    Matcher m = REMOVE_TAGS.matcher(string);
    return m.replaceAll("");
}


답변

Jericho를 사용하면 매우 간단 하며 일부 서식 (예 : 줄 바꿈 및 링크)을 유지할 수 있습니다.

    Source htmlSource = new Source(htmlText);
    Segment htmlSeg = new Segment(htmlSource, 0, htmlSource.length());
    Renderer htmlRend = new Renderer(htmlSeg);
    System.out.println(htmlRend.toString());


답변

단순히 일을 허용 대답은 Jsoup.parse(html).text()(JSoup 1.7.3 포함)이 잠재적 인 문제를 가지고 :

  • 텍스트에서 줄 바꿈을 제거합니다.
  • 텍스트 &lt;script&gt;<script>

이것을 사용하여 XSS로부터 보호한다면, 이것은 약간 성가신 일입니다. 다음은 JSoup과 Apache StringEscapeUtils를 모두 사용하여 개선 된 솔루션에 대한 최고의 정보입니다.

// breaks multi-level of escaping, preventing &amp;lt;script&amp;gt; to be rendered as <script>
String replace = input.replace("&amp;", "");
// decode any encoded html, preventing &lt;script&gt; to be rendered as <script>
String html = StringEscapeUtils.unescapeHtml(replace);
// remove all html tags, but maintain line breaks
String clean = Jsoup.clean(html, "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));
// decode html again to convert character entities back into text
return StringEscapeUtils.unescapeHtml(clean);

마지막 단계는 출력을 일반 텍스트로 사용해야하기 때문입니다. HTML 출력 만 필요한 경우이를 제거 할 수 있어야합니다.

다음은 많은 테스트 사례입니다 (출력에 입력).

{"regular string", "regular string"},
{"<a href=\"link\">A link</a>", "A link"},
{"<script src=\"http://evil.url.com\"/>", ""},
{"&lt;script&gt;", ""},
{"&amp;lt;script&amp;gt;", "lt;scriptgt;"}, // best effort
{"\" ' > < \n \\ é å à ü and & preserved", "\" ' > < \n \\ é å à ü and & preserved"}

더 나은 방법을 찾으면 알려주십시오.