文字列からHTMLタグを削除する


422

Java文字列からHTMLを削除する良い方法はありますか?のような単純な正規表現

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

は機能し&amp;ますが、正しく変換されず、2つの山括弧の間の非HTMLは削除されます(つまり.*?、正規表現内のは表示されなくなります)。


2
これを次のガイドで使用してください:コンパイル 'org.jsoup:jsoup:1.9.2'
VahidHoseini


次も参照してください:stackoverflow.com/a/21838532/363573
Stephan

回答:


572

正規表現の代わりにHTMLパーサーを使用します。これはJsoup非常に簡単です

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

Jsoupは、カスタマイズ可能なホワイトリストに対するHTMLタグの削除もサポートしています。これは<b>、たとえば<i>とのみを許可する場合に非常に役立ちます<u>

以下も参照してください。


18
Jsoupはすばらしいですが、いくつかの欠点がありました。私はXSSを取り除くためにそれを使用しているので、基本的にプレーンテキストの入力を期待していますが、悪意のある人がHTMLを送信しようとする可能性があります。Jsoupを使用すると、すべてのHTMLを削除できますが、残念ながら、多くのスペースが1つに縮小され、リンクの切れ目(\ n文字)が削除されます
Ridcully

7
@Ridcully:Jsoup#clean()代わりに使用したい。
BalusC 2010

3
clean()を使用しても、余分なスペースと\ n文字が削除されます。例:Jsoup.clean( "a \ n b"、Whitelist.none())は "a b"を返します
Keith

20
@Zeroows:これは無惨に失敗し<p>Lorem ipsum 1 < 3 dolor sit amet</p>ます。繰り返しになりますがHTMLは通常の言語ではありません。実際のパーサーを使用する代わりに、誰もが正規表現をスローして関心のある部分を解析しようとし続けるのは、私を完全に超えています。
BalusC 2013年

4
Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));改行を保持するために使用
Marc Johnen

275

あなたがAndroid用に書いているなら、これを行うことができます...

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

12
素晴らしいヒント。:) TextViewでテキストを表示している場合は、.toString()をドロップして、一部のフォーマットを保持することもできます。
Lorne Laliberte、2012年

1
@Brankyそれは私が試したことはありません...受け入れられた答えはチャームのように機能します
Maverick

よく働く。すべてのhtmlタグが文字列から削除されました。
user3144836

1
これは良いですが、<img>タグはいくつかの奇妙なものに置き換えられます。画像のある小さな正方形を手に入れました
Bibaswann Bandyopadhyay

1
@BibaswannBandyopadhyay 別の答えは、これらのキャラクターを取り除くのに役立ちます
Vince

84

ユーザーがと入力した場合、<b>hey!</b>表示します<b>hey!</b>hey!?最初の場合は、以下のエスケープ、およびhtmlエンコードのアンパサンド(およびオプションで引用符)をエスケープすれば問題ありません。2番目のオプションを実装するためのコードの変更は次のようになります。

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

しかし、ユーザーがのような不正なものを入力すると、問題が発生します<bhey!</b>

「汚い」html入力を解析するJTidyをチェックアウトして、テキストを保持しながらタグを削除する方法を提供することもできます。

htmlを削除しようとする際の問題は、ブラウザーには非常に寛大なパーサーがあり、他のライブラリよりも寛容であるため、すべてのタグを削除するために最善を尽くしても(上記のreplaceメソッド、DOMライブラリ、またはJTidyを使用) 、あなたがしますまだあなたの出力の安全を保つために、残りのHTMLの特殊文字をエンコードすることを確認する必要があります。


1
また、htmlノードコンテンツ内にエスケープされていない<または>記号がある場合、問題が発生します。<span>私の年齢は<たくさんのテキスト>であなたの年齢です</ span>。これを行う唯一の方法は、node.getText()を使用するために(SAXなどの)XML DOMインターフェースを経由することだと思います。
ミチャガスティン2017年

29

別の方法は、 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タグを削除して、テキストのみを抽出します


5
「a <bまたはb> c」の結果は「abまたはb> c」ですが、これは残念なことのようです。
dfrankow 2010

1
これは私にとって最も効果的でした。改行を保存する必要がありました。この単純なメソッドをパーサーに追加することで、次のようにしました。@Override public void handleStartTag(HTML.Tag t、MutableAttributeSet a、int pos){if(t == HTML.Tag.P || t == HTML.Tag.BR) {s.append( '\ n'); }}
MiguelMunoz

1
dfrankow:数式a <bまたはb> cは、次のようにhtmlで記述する必要があります:a&lt; bまたはb&gt; c
ミゲルムニョス

24

私は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("");
}

18

また、Jerichoを使用すると非常に簡単で、一部の書式設定(たとえば、改行やリンク)を保持できます。

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

4
Jerichoは<br>を解析して改行することができました。JsoupとHTMLEditorKitはそれを行うことができませんでした。
homaxto 2011

ジェリコはこの仕事をするのに非常に能力があり、所有するプロジェクトでそれを多く使用しました。
Jerry Tian

3
エリコは魅力のように働きました。提案をありがとう。注:文字列全体のセグメントを作成する必要はありません。ソースはセグメントを拡張するため、どちらもレンダラーコンストラクターで機能します。
MrPlow、2015

Jericoは少し古いようです(最後のリリースは2015年後半の3.4でした)。ただし、それでも問題なく機能する場合は、問題なく機能します。
ジョナサンハルト2017年

17

受け入れられた回答にJsoup.parse(html).text()は、2つの潜在的な問題があります(JSout 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"}

それをより良くする方法を見つけたら、私に知らせてください。


2
これはのようなものに対して失敗します&#38;lt;script&#38;gt;alert('Evil script executed');&#38;lt;/script&#38;gt;。同じことが当てはまります&#x26;。JSoupは変換しません。JSoupが入力をクリーンアップした後に&lt;script&gt; into <script>呼び出しStringEscapeUtils.unescapeHtmlたためです。
Guillaume Polet 2015

15

Androidでは、これを試してください:

String result = Html.fromHtml(html).toString();

やった!テキストからすべてのインラインhtmlを削除しました:)
DritanX

1
通常のコードでは、常にコードスニペットを使用しています。コードスニペットは、HTML、JavaScript、またはブラウザで実行できるその他のコードでのみ使用することを想定しています。ブラウザでJavaを実行することはできません。将来は通常のコードブロックを使用してください...今回は回答を編集し、書式設定などを修正しますが、今後はこれを行わないでください。私がこれについてあなたに話したのはこれが初めてではありません...
Xaver Kapeller

1
@PaulCroarkinこれはandroid sdk内のライブラリです。android.text.Html
Ameen Maheen 2015年

1
驚くばかり。すべてのhtmlタグを削除しました。
user3144836 2015

2
2011年から私の答えのように、見慣れ
ケン・グッドリッジ

11

HTMLエスケープを正しく行うのは本当に難しいです。ライブラリコードを使用してこれを行うことをお勧めします。思ったよりもはるかに微妙なためです。Javaでこれを処理するための非常に優れたライブラリーについては、ApacheのStringEscapeUtilsを調べてください。


これは私が探しているものですが、エスケープするのではなくHTMLを取り除きたいです。
メイソン

HTMLを削除しますか、それともプレーンテキストに変換しますか?brタグとHTMLエンティティを含む長い文字列からHTMLを取り除くと、混乱を招く可能性があります。
Tim Howland、

4
StringEscapeUtils.unescapeHtmlはHTMLを取り除きません
エリンドラモンド

5
エスケープを解除するが質問に答えないために使用するutilsに関する良い情報。
Alex

3
混乱する答え。削除=エスケープ解除
Lluis Martinez

7

これはうまくいくはずです-

これを使って

  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 &nbsp;, &amp;, &gt; etc.

1
一般に、コードが何をしようとしているのかについての説明が含まれている場合、回答ははるかに役立ちます。
ピーター

6

Timが示唆するように、HTMLを取り除いて判読できない混乱を防ぐ前に、HTMLを削除する前に<br/></p>タグを改行で置き換えることができます。

HTMLタグを削除することを考えることができる唯一の方法ですが、山かっこの間に非HTMLを残すことは、HTMLタグのリストに対してチェックすることです。これらの線に沿って何か...

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

次に、などの特殊文字をHTMLデコードし&amp;ます。結果は消毒されたと見なされるべきではありません。


5

または、HtmlCleanerを使用できます。

private CharSequence removeHtmlFrom(String html) {
    return new HtmlCleaner().clean(html).getText();
}

2
HtmlCleanerはうまく機能し、改行を保持し、最近のリリース(2017年5月の2.21)を持っています。
ジョナサンハルト2017年

4

私が示したテストケースでは、受け入れられた回答が機能しませんでした。「a <bまたはb> c」の結果は「abまたは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 {
}
}

4

私はこれが古いことを知っていますが、HTMLをフィルタリングする必要があるプロジェクトに取り組んでいて、これはうまくいきました:

noHTMLString.replaceAll("\\&.*?\\;", "");

これの代わりに:

html = html.replaceAll("&nbsp;","");
html = html.replaceAll("&amp;"."");

4

以下は、ブレークとリストのフォーマットを処理するための、より具体的な更新です。Amayaの出力をガイドとして使用しました。

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));
    }
}

4

使用する Html.fromHtml

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.TagHandler引数として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());

出力

これは私のユーザーが自分のプロフィールに入力できるテキストです


1
追加のユーティリティはなく、Androidドキュメントと連携します。+1
2016年

4

すべてを置き換える方法のもう1つのバリエーションを次に示します(HTMLタグ| HTMLエンティティ| HTMLコンテンツの空のスペース)

content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", ""); ここで、コンテンツは文字列です。


1
少し改善しました:{code} .replaceAll( "(<。*?>)|(&。* ?;)"、 "").replaceAll( "\\ s {2、}"、 ""){多くの場合、これらのタグはテキストのすぐ隣にあります。タグを削除した後、2つ以上の書き込みスペースをすべて1に変更します。
OndřejStašek19年

4

AndroidのデフォルトのHTMLフィルターを使用するだけです

    public String htmlToStringFilter(String textToFilter){

    return Html.fromHtml(textToFilter).toString();

    }

上記のメソッドは、入力に対してHTMLフィルタリングされた文字列を返します。


3

もう1つの方法は、次のようなcom.google.gdata.util.common.html.HtmlToTextクラスを使用することです。

MyWriter.toConsole(HtmlToText.htmlToPlainText(htmlResponse));

ただし、これは防弾コードではありません。ウィキペディアのエントリで実行すると、スタイル情報も取得されます。しかし、私は小さい/単純な仕事のためにこれは効果的であると信じています。


3

HTMLからプレーンテキストに移行したいようです。
その場合は、www.htmlparser.orgをご覧ください。以下は、URLで見つかったhtmlファイルからすべてのタグを取り除く例です。org.htmlparser.beans.StringBean
を使用します

static public String getUrlContentsAsText(String url) {
    String content = "";
    StringBean stringBean = new StringBean();
    stringBean.setURL(url);
    content = stringBean.getStrings();
    return content;
}

2

これを行う別の方法を次に示します。

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;
}

または、if(input.indexOf( "<")> 0 || input.indexOf( ">")> 0)return "";と言うこともできます。それ以外の場合は入力を返します。
Hossein Shahdoost 2013

2

この目的で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())

1
parseメソッドは非推奨になっていることに注意してくださいParse.parse(InputStream, ContentHandler, Metadata, ParseContext)
Jacob van Lingen、2015

1

JSoupで改行情報を保持する1つの方法は、すべての改行タグの前にいくつかのダミー文字列を置き、JSoopを実行して、ダミー文字列を "\ 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");

1
classeString.replaceAll("\\<(/?[^\\>]+)\\>", "\\ ").replaceAll("\\s+", " ").trim() 

3
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の質を高めるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。また、コードと説明コメントを混同しないようにしてください。これにより、コードと説明の両方が読みにくくなります。
Filnor、

0

私の5セント:

String[] temp = yourString.split("&amp;");
String tmp = "";
if (temp.length > 1) {

    for (int i = 0; i < temp.length; i++) {
        tmp += temp[i] + "&";
    }
    yourString = tmp.substring(0, tmp.length() - 1);
}

0

形成されたプレーンHTMLテキストを取得するには、次のようにします。

String BR_ESCAPED = "&lt;br/&gt;";
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>を\ n変更し、最後の行を次のように変更します。

nodeValue=nodeValue.replaceAll("(\\s*\n){3,}", "<br/><br/>");

0

私はこの質問が尋ねられてからしばらく経っていることを知っていますが、別の解決策を見つけました、これは私にとってうまくいったものです:

Pattern REMOVE_TAGS = Pattern.compile("<.+?>");
    Source source= new Source(htmlAsString);
 Matcher m = REMOVE_TAGS.matcher(sourceStep.getTextExtractor().toString());
                        String clearedHtml= m.replaceAll("");

-1

あなたは単純に複数のreplaceAll()でメソッドを作ることができます

String RemoveTag(String html){
   html = html.replaceAll("\\<.*?>","")
   html = html.replaceAll("&nbsp;","");
   html = html.replaceAll("&amp;"."");
   ----------
   ----------
   return html;
}

必要な最も一般的な置き換えには、このリンクを使用してください:http : //tunes.org/wiki/html_20special_20characters_20and_20symbols.html

シンプルですが効果的です。最初にこのメソッドを使用してジャンクを削除しますが、最初の行(replaceAll( "\ <。*?>"、 "")は削除しません。その後、特定のキーワードを使用してインデックスを検索し、次に.substring(start、end )不要なものを取り除く方法。これはより堅牢で、HTMLページ全体で必要なものを正確に特定できるためです。


4
2つのメモ。まず、これは最適ではありません。replaceAll呼び出しごとに、Javaは最初の引数を正規表現としてコンパイルし、文字列全体を実行してその正規表現を文字列に適用し、通常のHTMLページに対して毎回数十KBを処理します。次に、replaceAllを使用して単純な(正規表現ではない)文字列を置き換えるのではなく、代わりにreplace()を使用することをお勧めします(名前が示すように、すべてを置き換えます)。
fwielstra 2010

-1

文字列からHTMLタグを削除します。どこかで、サーバーからのHttpresponseなどのいくつかの応答によって受信される文字列を解析する必要があります。

したがって、それを解析する必要があります。

ここでは、文字列からhtmlタグを削除する方法を示します。

    // sample text with tags

    string str = "<html><head>sdfkashf sdf</head><body>sdfasdf</body></html>";



    // regex which match tags

    System.Text.RegularExpressions.Regex rx = new System.Text.RegularExpressions.Regex("<[^>]*>");



    // replace all matches with empty strin

    str = rx.Replace(str, "");



    //now str contains string without html tags

どこnew System.Text.RegularExpressions.Regex();から来ましたか?
beresfordt 2015年

1
@beresfordtこの応答は.NETに適用され、Javaのように質問で要求されたものではありません
Erin Drummond
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.