문자열에서 HTML 태그 제거
Java 문자열에서 HTML을 삭제하는 좋은 방법이 있나요?다음과 같은 단순한 정규식
replaceAll("\\<.*?>", "")
「 」와 같은 .&
되지 않고 두 의 꺾쇠 사이에 "HTML"이 .*?
정규식이 사라집니다).
regex 대신 HTML 파서를 사용합니다.Jsoup은 아주 간단합니다.
public static String html2text(String html) {
return Jsoup.parse(html).text();
}
Jsoup은 사용자 정의 가능한 화이트리스트에 대한 HTML 태그 제거도 지원하므로 다음과 같은 경우에만 매우 유용합니다. <b>
,<i>
★★★★★★★★★★★★★★★★★」<u>
.
다음 항목도 참조하십시오.
- XHTML 자체 포함 태그를 제외한 열려 있는 태그와 RegEx 일치
- 주요 Java HTML 파서의 장점과 단점은 무엇입니까?
- JSP/Servlet 웹 응용 프로그램에서의 XSS 방지
Android용으로 글을 쓰고 있다면...
Androidx.core.text.Html(명령, Html Compat).FROM_HTML_MODE_LEGACY).toString()
가 " " 를 했을 경우<b>hey!</b>
「 「 」를 하시겠습니까?<b>hey!</b>
★★★★★★★★★★★★★★★★★」hey!
less-thans - html ampers앰퍼샌드(암페어샌드) (이이 。과 같습니다
replaceAll("\\<[^>]*>","")
했을 때 됩니다.<bhey!</b>
.
또한 JTidy를 체크하면 "더러운" html 입력을 해석하여 태그를 삭제하고 텍스트를 유지할 수 있습니다.
html을 삭제하려고 할 때의 문제는 브라우저에 매우 관대한 파서가 있다는 것입니다.따라서 (위의 치환 방법, 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()
에는 2개의 문제가 1.7의 경우). 2개의 잠재적인 문제가 있습니다.
- 텍스트에서 줄 바꿈을 제거합니다.
- 가 변환됩니다.
<script>
<script>
XSS로부터 보호하기 위해서 이것을 사용하는 경우는, 조금 귀찮습니다.다음은 JSoup과 Apache StringEscapeUtils를 모두 사용한 개선된 솔루션에 대한 최선의 방법입니다.
// breaks multi-level of escaping, preventing &lt;script&gt; to be rendered as <script>
String replace = input.replace("&", "");
// decode any encoded html, preventing <script> 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\"/>", ""},
{"<script>", ""},
{"&lt;script&gt;", "lt;scriptgt;"}, // best effort
{"\" ' > < \n \\ é å à ü and & preserved", "\" ' > < \n \\ é å à ü and & preserved"}
개선할 방법이 있으면 알려주세요.
Android에서 다음을 시도해 보십시오.
String result = Html.fromHtml(html).toString();
HTML 이스케이프는 매우 어렵습니다.이것에 라이브러리 코드를 사용하는 것을 추천합니다.생각보다 훨씬 더 섬세하기 때문입니다.Apache의 StringEscapeUtils에서 Java에서 이를 처리하기 위한 매우 좋은 라이브러리를 확인하십시오.
이 방법은 유효합니다.
이것을 사용하다
text.replaceAll('<.*?>' , " ") -> This will replace all the html tags with a space.
그리고 이건
text.replaceAll('&.*?;' , "")-> this will replace all the tags which starts with "&" and ends with ";" like , &, > etc.
Android의 기본 HTML 필터를 사용할 수 있습니다.
public String htmlToStringFilter(String textToFilter){
return Html.fromHtml(textToFilter).toString();
}
위의 메서드는 입력용으로 HTML 필터링된 문자열을 반환합니다.
경우, 이 부분을 대체하는 것이 것 같습니다.<br/>
★★★★★★★★★★★★★★★★★」</p>
HTML을 삭제하기 전에 줄바꿈으로 태그를 붙여서 Tim이 제안하는 것처럼 읽기 어려운 혼란이 되지 않도록 합니다.
HTML 태그를 제거하고 각 괄호 사이에 HTML이 아닌 것을 남겨두는 유일한 방법은 HTML 태그 목록과 대조하는 것입니다.이런 식으로 뭔가...
replaceAll("\\<[\s]*tag[^>]*>","")
그런 다음 다음과 같은 특수 문자를 해독합니다.&
결과는 소독된 것으로 간주해서는 안 됩니다.
또는 HtmlCleaner를 사용할 수도 있습니다.
private CharSequence removeHtmlFrom(String html) {
return new HtmlCleaner().clean(html).getText();
}
사용
HTML 태그는
<a href=”…”> <b>, <big>, <blockquote>, <br>, <cite>, <dfn>
<div align=”…”>, <em>, <font size=”…” color=”…” face=”…”>
<h1>, <h2>, <h3>, <h4>, <h5>, <h6>
<i>, <p>, <small>
<strike>, <strong>, <sub>, <sup>, <tt>, <u>
Android의 공식 설명서에 따르면 HTML 내의 태그는 일반적인 대체 문자열로 표시됩니다.이 문자열은 프로그램에서 실제 문자열로 대체될 수 있습니다.
Html.formHtml
메서드는 및 HTML을 사용합니다.ImageGetter 및 인수 및 해석할 텍스트.
예
String Str_Html=" <p>This is about me text that the user can put into their profile</p> ";
그리고나서
Your_TextView_Obj.setText(Html.fromHtml(Str_Html).toString());
산출량
이것은 사용자가 프로필에 넣을 수 있는 나에 대한 텍스트입니다.
com.google.gdata.util.common.html을 사용하는 방법도 있습니다.HtmlToText 클래스처럼
MyWriter.toConsole(HtmlToText.htmlToPlainText(htmlResponse));
방탄코드는 아니지만 위키피디아 엔트리에서 실행하면 스타일 정보도 나옵니다.다만, 소규모/단순한 업무에서는 이것이 효과적이라고 생각합니다.
제가 지적한 테스트 케이스에 대해서는 접수된 답변이 효과가 없었습니다.「 a < b or b > c 」의 결과는 「a b or b > c」입니다.
그래서 대신 TagSoup을 썼어요.테스트 케이스(및 기타 몇 가지)에 도움이 되는 샷을 다음에 나타냅니다.
import java.io.IOException;
import java.io.StringReader;
import java.util.logging.Logger;
import org.ccil.cowan.tagsoup.Parser;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
/**
* Take HTML and give back the text part while dropping the HTML tags.
*
* There is some risk that using TagSoup means we'll permute non-HTML text.
* However, it seems to work the best so far in test cases.
*
* @author dan
* @see <a href="http://home.ccil.org/~cowan/XML/tagsoup/">TagSoup</a>
*/
public class Html2Text2 implements ContentHandler {
private StringBuffer sb;
public Html2Text2() {
}
public void parse(String str) throws IOException, SAXException {
XMLReader reader = new Parser();
reader.setContentHandler(this);
sb = new StringBuffer();
reader.parse(new InputSource(new StringReader(str)));
}
public String getText() {
return sb.toString();
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
for (int idx = 0; idx < length; idx++) {
sb.append(ch[idx+start]);
}
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
sb.append(ch);
}
// The methods below do not contribute to the text
@Override
public void endDocument() throws SAXException {
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
}
@Override
public void processingInstruction(String target, String data)
throws SAXException {
}
@Override
public void setDocumentLocator(Locator locator) {
}
@Override
public void skippedEntity(String name) throws SAXException {
}
@Override
public void startDocument() throws SAXException {
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
}
@Override
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
}
}
오래된 것은 알지만 HTML을 필터링해야 하는 프로젝트를 진행 중이었고, 이 작업은 정상적으로 진행되었습니다.
noHTMLString.replaceAll("\\&.*?\\;", "");
이 대신:
html = html.replaceAll(" ","");
html = html.replaceAll("&"."");
다음은 구분 및 목록 포맷을 처리하기 위해 약간 더 구체화된 업데이트입니다.저는 아마야의 산출물을 가이드로 삼았습니다.
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.Stack;
import java.util.logging.Logger;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;
public class HTML2Text extends HTMLEditorKit.ParserCallback {
private static final Logger log = Logger
.getLogger(Logger.GLOBAL_LOGGER_NAME);
private StringBuffer stringBuffer;
private Stack<IndexType> indentStack;
public static class IndexType {
public String type;
public int counter; // used for ordered lists
public IndexType(String type) {
this.type = type;
counter = 0;
}
}
public HTML2Text() {
stringBuffer = new StringBuffer();
indentStack = new Stack<IndexType>();
}
public static String convert(String html) {
HTML2Text parser = new HTML2Text();
Reader in = new StringReader(html);
try {
// the HTML to convert
parser.parse(in);
} catch (Exception e) {
log.severe(e.getMessage());
} finally {
try {
in.close();
} catch (IOException ioe) {
// this should never happen
}
}
return parser.getText();
}
public void parse(Reader in) throws IOException {
ParserDelegator delegator = new ParserDelegator();
// the third parameter is TRUE to ignore charset directive
delegator.parse(in, this, Boolean.TRUE);
}
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
log.info("StartTag:" + t.toString());
if (t.toString().equals("p")) {
if (stringBuffer.length() > 0
&& !stringBuffer.substring(stringBuffer.length() - 1)
.equals("\n")) {
newLine();
}
newLine();
} else if (t.toString().equals("ol")) {
indentStack.push(new IndexType("ol"));
newLine();
} else if (t.toString().equals("ul")) {
indentStack.push(new IndexType("ul"));
newLine();
} else if (t.toString().equals("li")) {
IndexType parent = indentStack.peek();
if (parent.type.equals("ol")) {
String numberString = "" + (++parent.counter) + ".";
stringBuffer.append(numberString);
for (int i = 0; i < (4 - numberString.length()); i++) {
stringBuffer.append(" ");
}
} else {
stringBuffer.append("* ");
}
indentStack.push(new IndexType("li"));
} else if (t.toString().equals("dl")) {
newLine();
} else if (t.toString().equals("dt")) {
newLine();
} else if (t.toString().equals("dd")) {
indentStack.push(new IndexType("dd"));
newLine();
}
}
private void newLine() {
stringBuffer.append("\n");
for (int i = 0; i < indentStack.size(); i++) {
stringBuffer.append(" ");
}
}
public void handleEndTag(HTML.Tag t, int pos) {
log.info("EndTag:" + t.toString());
if (t.toString().equals("p")) {
newLine();
} else if (t.toString().equals("ol")) {
indentStack.pop();
;
newLine();
} else if (t.toString().equals("ul")) {
indentStack.pop();
;
newLine();
} else if (t.toString().equals("li")) {
indentStack.pop();
;
newLine();
} else if (t.toString().equals("dd")) {
indentStack.pop();
;
}
}
public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
log.info("SimpleTag:" + t.toString());
if (t.toString().equals("br")) {
newLine();
}
}
public void handleText(char[] text, int pos) {
log.info("Text:" + new String(text));
stringBuffer.append(text);
}
public String getText() {
return stringBuffer.toString();
}
public static void main(String args[]) {
String html = "<html><body><p>paragraph at start</p>hello<br />What is happening?<p>this is a<br />mutiline paragraph</p><ol> <li>This</li> <li>is</li> <li>an</li> <li>ordered</li> <li>list <p>with</p> <ul> <li>another</li> <li>list <dl> <dt>This</dt> <dt>is</dt> <dd>sdasd</dd> <dd>sdasda</dd> <dd>asda <p>aasdas</p> </dd> <dd>sdada</dd> <dt>fsdfsdfsd</dt> </dl> <dl> <dt>vbcvcvbcvb</dt> <dt>cvbcvbc</dt> <dd>vbcbcvbcvb</dd> <dt>cvbcv</dt> <dt></dt> </dl> <dl> <dt></dt> </dl></li> <li>cool</li> </ul> <p>stuff</p> </li> <li>cool</li></ol><p></p></body></html>";
System.out.println(convert(html));
}
}
다음으로 모든 것을 치환하는 방법을 나타냅니다(HTML 태그 |HTML 엔티티 |HTML 콘텐츠의 빈 공간).
content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", "");
여기서 content는 String입니다.
HTML에서 일반 텍스트로 바꾸고 싶은 것 같네요.
이 경우는, www.htmlparser.org 를 참조해 주세요.다음은 URL에 있는 html 파일에서 모든 태그를 삭제하는 예입니다.
org.htmlparser를 사용합니다.beats.StringBean.
static public String getUrlContentsAsText(String url) {
String content = "";
StringBean stringBean = new StringBean();
stringBean.setURL(url);
content = stringBean.getStrings();
return content;
}
다른 방법은 다음과 같습니다.
public static String removeHTML(String input) {
int i = 0;
String[] str = input.split("");
String s = "";
boolean inTag = false;
for (i = input.indexOf("<"); i < input.indexOf(">"); i++) {
inTag = true;
}
if (!inTag) {
for (i = 0; i < str.length; i++) {
s = s + str[i];
}
}
return s;
}
Apache Tika를 사용할 수도 있습니다.기본적으로는 제거된 html의 공백이 유지되며 다음과 같은 경우에 필요할 수 있습니다.
InputStream htmlInputStream = ..
HtmlParser htmlParser = new HtmlParser();
HtmlContentHandler htmlContentHandler = new HtmlContentHandler();
htmlParser.parse(htmlInputStream, htmlContentHandler, new Metadata())
System.out.println(htmlContentHandler.getBodyText().trim())
JSoup을 사용하여 새 행 정보를 유지하는 한 가지 방법은 모든 새 행 태그 앞에 더미 문자열을 추가하고, 더미 문자열을 "\n"로 바꾸는 것입니다.
String html = "<p>Line one</p><p>Line two</p>Line three<br/>etc.";
String NEW_LINE_MARK = "NEWLINESTART1234567890NEWLINEEND";
for (String tag: new String[]{"</p>","<br/>","</h1>","</h2>","</h3>","</h4>","</h5>","</h6>","</li>"}) {
html = html.replace(tag, NEW_LINE_MARK+tag);
}
String text = Jsoup.parse(html).text();
text = text.replace(NEW_LINE_MARK + " ", "\n\n");
text = text.replace(NEW_LINE_MARK, "\n\n");
classeString.replaceAll("\\<(/?[^\\>]+)\\>", "\\ ").replaceAll("\\s+", " ").trim()
javascript의 경우 다음을 시도해 보십시오.
const strippedString = htmlString.replace(/(<([^>]+)>)/gi, "");
console.log(strippedString);
내 5센트:
String[] temp = yourString.split("&");
String tmp = "";
if (temp.length > 1) {
for (int i = 0; i < temp.length; i++) {
tmp += temp[i] + "&";
}
yourString = tmp.substring(0, tmp.length() - 1);
}
포맷된 플레인 html 텍스트를 가져오려면 다음을 수행합니다.
String BR_ESCAPED = "<br/>";
Element el=Jsoup.parse(html).select("body");
el.select("br").append(BR_ESCAPED);
el.select("p").append(BR_ESCAPED+BR_ESCAPED);
el.select("h1").append(BR_ESCAPED+BR_ESCAPED);
el.select("h2").append(BR_ESCAPED+BR_ESCAPED);
el.select("h3").append(BR_ESCAPED+BR_ESCAPED);
el.select("h4").append(BR_ESCAPED+BR_ESCAPED);
el.select("h5").append(BR_ESCAPED+BR_ESCAPED);
String nodeValue=el.text();
nodeValue=nodeValue.replaceAll(BR_ESCAPED, "<br/>");
nodeValue=nodeValue.replaceAll("(\\s*<br[^>]*>){3,}", "<br/><br/>");
정형화된 플레인텍스트를 \n으로 변경하고 마지막 행을 변경하려면 다음 절차를 수행합니다.
nodeValue=nodeValue.replaceAll("(\\s*\n){3,}", "<br/><br/>");
이 질문은 오랜만이지만, 저는 다른 해결책을 찾았습니다.그것은 저에게 효과가 있었습니다.
Pattern REMOVE_TAGS = Pattern.compile("<.+?>");
Source source= new Source(htmlAsString);
Matcher m = REMOVE_TAGS.matcher(sourceStep.getTextExtractor().toString());
String clearedHtml= m.replaceAll("");
서비스 스택 프로젝트에서 이를 달성하려면 이미 내장된 문자열 확장자여야 합니다.
using ServiceStack.Text;
// ...
"The <b>quick</b> brown <p> fox </p> jumps over the lazy dog".StripHtml();
댓글과 스크립트 요소만 제거하면 되는 경우가 많습니다.이 기능은 15년 동안 안정적으로 작동했으며 HTML 또는 XML의 요소 이름을 처리하기 위해 쉽게 확장할 수 있습니다.
// delete all comments
response = response.replaceAll("<!--[^>]*-->", "");
// delete all script elements
response = response.replaceAll("<(script|SCRIPT)[^+]*?>[^>]*?<(/script|SCRIPT)>", "");
언급URL : https://stackoverflow.com/questions/240546/remove-html-tags-from-a-string
'programing' 카테고리의 다른 글
Big Decimal 추가 (0) | 2022.08.15 |
---|---|
vuejs2에서 컨트롤러를 사용하는 방법 (0) | 2022.08.15 |
Vuetify의 큰 크기의 v-checkbox 요소 문제 (0) | 2022.08.15 |
폴링과 셀렉트의 차이점은 무엇입니까? (0) | 2022.08.15 |
VueX 변환 최적화 (0) | 2022.08.15 |