Rimuovi i tag HTML da una stringa


422

C'è un buon modo per rimuovere HTML da una stringa Java? Un regex semplice come

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

funzionerà, ma cose come &amp;non verranno convertite correttamente e il non-HTML tra le due parentesi angolari verrà rimosso (cioè .*?il regex scomparirà).


2
usa questo con la seguente guida: compila 'org.jsoup: jsoup: 1.9.2'
VahidHoseini,


Risposte:


572

Utilizzare un parser HTML anziché regex. Questo è semplicissimo con Jsoup .

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

Jsoup anche supporta la rimozione di tag HTML contro una whitelist personalizzabile, che è molto utile se si desidera consentire solo ad esempio <b>, <i>e <u>.

Guarda anche:


18
Jsoup è carino, ma ho riscontrato alcuni svantaggi. Lo uso per sbarazzarmi di XSS, quindi sostanzialmente mi aspetto un semplice input di testo, ma qualche persona malvagia potrebbe provare a mandarmi un po 'di HTML. Usando Jsoup, posso rimuovere tutto l'HTML ma, sfortunatamente, riduce anche molti spazi a uno e rimuove le interruzioni di collegamento (\ n caratteri)
Ridcully

7
@Ridcully: per quello che vorresti usare Jsoup#clean()invece.
BalusC

3
l'uso di clean () causerà comunque la rimozione di spazi extra e \ n caratteri. es: Jsoup.clean ("a \ n b", Whitelist.none ()) restituisce "a b"
Keith

20
@Zeroows: fallisce miseramente <p>Lorem ipsum 1 < 3 dolor sit amet</p>. Ancora una volta, HTML non è un linguaggio normale . È completamente al di là di me il motivo per cui tutti continuano a provare a lanciare regex su di esso per analizzare parti di interesse invece di utilizzare un vero parser.
BalusC

4
usare Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));per preservare le interruzioni di
riga

275

Se stai scrivendo per Android puoi farlo ...

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

12
Suggerimento eccezionale. :) Se stai visualizzando il testo in TextView, puoi anche rilasciare .toString () per conservare anche un po 'di formattazione.
Lorne Laliberte,

1
@Branky Non ho provato ... la risposta accettata funziona come per incanto
Maverick

Funziona alla grande. Tutti i tag html sono stati rimossi dalla stringa.
user3144836

1
Questo è buono, ma i tag <img> vengono sostituiti con alcune cose bizzarre. Ho ottenuto dei quadratini in cui c'era un'immagine
Bibaswann Bandyopadhyay,

1
@BibaswannBandyopadhyay un'altra risposta aiuta a sbarazzarsi di questi personaggi
Vince il

84

Se l'utente inserisce <b>hey!</b>, si desidera visualizzare <b>hey!</b>o hey!? Se il primo, scappa meno di, e codifica html e commerciale (e facoltativamente virgolette) e stai bene. Una modifica al tuo codice per implementare la seconda opzione sarebbe:

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

ma ti imbatterai in problemi se l'utente inserisce qualcosa di malformato, come <bhey!</b>.

Puoi anche dare un'occhiata a JTidy che analizzerà l'input html "sporco" e dovrebbe darti un modo per rimuovere i tag, mantenendo il testo.

Il problema con il tentativo di eliminare html è che i browser hanno parser molto indulgenti, più indulgenti di qualsiasi libreria tu possa trovare, quindi anche se fai del tuo meglio per eliminare tutti i tag (usando il metodo di sostituzione sopra, una libreria DOM o JTidy) , dovrai comunque assicurarti di codificare tutti i caratteri speciali HTML rimanenti per proteggere l'output.


1
Si verificano anche problemi, se nel contenuto del nodo html è presente un segno <o> senza caratteri di escape. <span> La mia età è <molto testo> quindi la tua età </span>. penso che solo il 100% del modo per farlo sia tramite un'interfaccia DOM XML (come SAX o simili), per usare node.getText ().
Mitja Gustin,

29

Un altro modo è utilizzare javax.swing.text.html.HTMLEditorKit per estrarre il testo.

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: rimuove i tag HTML da un file per estrarre solo il TESTO


5
Il risultato di "a <b o b> c" è "ab o b> c", che sembra sfortunato.
domenica

1
Questo ha funzionato al meglio per me. Avevo bisogno di preservare le interruzioni di riga. Ho fatto aggiungendo questo semplice metodo al parser: @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: L'espressione matematica a <b o b> c dovrebbe essere scritta in html in questo modo: a & lt; b & b & gt; c
MiguelMunoz,

24

Penso che il modo più semplice per filtrare i tag html sia:

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

Anche molto semplice usando Jericho , e puoi conservare parte della formattazione (interruzioni di riga e collegamenti, per esempio).

    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 è stato in grado di analizzare una interruzione di linea. Jsoup e HTMLEditorKit non potevano farlo.
Homaxto,

Jericho è molto capace di fare questo lavoro, lo ha usato molto nei progetti di proprietà.
Jerry Tian,

3
Jericho ha funzionato come un fascino. Grazie per il suggerimento Una nota: non è necessario creare un segmento dell'intera stringa. La sorgente estende il segmento, quindi funziona nel costruttore del rendering.
Mr Plough,

Jerico ora sembra essere un po 'datato (l'ultima versione era la 3.4 alla fine del 2015). Tuttavia, se funziona ancora bene, allora funziona ancora bene!
Jonathan Hult,

17

La risposta accettata del fare Jsoup.parse(html).text()ha semplicemente 2 potenziali problemi (con JSoup 1.7.3):

  • Rimuove le interruzioni di riga dal testo
  • Converte il testo &lt;script&gt;in<script>

Se lo usi per proteggerti da XSS, questo è un po 'fastidioso. Ecco il mio colpo migliore con una soluzione migliorata, usando sia JSoup che 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);

Nota che l'ultimo passaggio è perché ho bisogno di usare l'output come testo normale. Se hai bisogno solo di un output HTML, dovresti riuscire a rimuoverlo.

Ed ecco un sacco di casi di test (input to output):

{"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"}

Se trovi un modo per migliorarlo, faccelo sapere.


2
Questo fallirà contro qualcosa del genere &#38;lt;script&#38;gt;alert('Evil script executed');&#38;lt;/script&#38;gt;. Lo stesso vale per &#x26;. JSoup non converte &lt;script&gt; into <script>, lo fa perché chiami StringEscapeUtils.unescapeHtmldopo che JSoup ha ripulito l'input.
Guillaume Polet,

15

Su Android, prova questo:

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

Questo l'ha fatto! ha rimosso tutto l'html in linea dal testo :)
DritanX,

1
Utilizzi sempre frammenti di codice per il codice normale. Gli snippet di codice devono essere utilizzati solo per HTML, javascript o altro codice che può essere eseguito nel browser. Non è possibile eseguire Java nel browser. Usa i normali blocchi di codice in futuro ... Modificherò la tua risposta per te questa volta e aggiusterò la formattazione ecc., Ma per favore non farlo più in futuro. Non è la prima volta che te ne parlo ...
Xaver Kapeller,

1
@PaulCroarkin questa è la libreria all'interno di Android SDK. android.text.Html
Ameen Maheen,

1
Eccezionale. Rimossi tutti i tag html.
user3144836

2
sembra familiare, come la mia risposta del 2011.
Ken Goodridge,

11

L'escaping HTML è davvero difficile da fare nel modo giusto: suggerirei sicuramente di utilizzare il codice della libreria per farlo, poiché è molto più sottile di quanto pensi. Dai un'occhiata a StringEscapeUtils di Apache per una libreria abbastanza buona per gestirla in Java.


Questo è il tipo di cosa che sto cercando, ma voglio eliminare l'HTML invece di sfuggirlo.
Mason,

vuoi rimuovere l'html o convertirlo in testo normale? Spogliare l'HTML da una lunga stringa con tag br ed entità HTML può causare un pasticcio illeggibile.
Tim Howland,

4
StringEscapeUtils.unescapeHtml non rimuove html
Erin Drummond

5
Buone informazioni sui programmi di utilità da utilizzare per annullare la escape ma non rispondere alla domanda.
Alex,

3
Risposta confusa. Removing! = Unescaping
Lluis Martinez,

7

Questo dovrebbe funzionare -

Usa questo

  text.replaceAll('<.*?>' , " ") -> This will replace all the html tags with a space.

e questo

  text.replaceAll('&.*?;' , "")-> this will replace all the tags which starts with "&" and ends with ";" like &nbsp;, &amp;, &gt; etc.

1
In generale, le risposte sono molto più utili se includono una spiegazione di ciò che il codice intende fare.
Peter,

6

Potresti voler sostituire <br/>e </p>tag con newline prima di eliminare l'HTML per evitare che diventi un pasticcio illeggibile come suggerisce Tim.

L'unico modo in cui riesco a pensare di rimuovere i tag HTML ma di lasciare un codice non HTML tra parentesi angolari sarebbe quello di verificare un elenco di tag HTML . Qualcosa del genere ...

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

Quindi caratteri speciali di decodifica HTML come &amp;. Il risultato non deve essere considerato sterilizzato.


5

In alternativa, è possibile utilizzare HtmlCleaner :

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

2
HtmlCleaner funziona bene, mantiene le interruzioni di riga e ha una versione recente (2.21 a maggio 2017).
Jonathan Hult,

4

La risposta accettata non ha funzionato per me nel caso di test che ho indicato: il risultato di "a <b o b> c" è "ab o b> c".

Quindi, ho usato TagSoup invece. Ecco uno scatto che ha funzionato per il mio caso di test (e un paio di altri):

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

So che questo è vecchio, ma stavo solo lavorando a un progetto che mi richiedeva di filtrare HTML e che funzionava bene:

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

Invece di questo:

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

4

Ecco un aggiornamento leggermente più elaborato per provare a gestire un po 'di formattazione per interruzioni ed elenchi. Ho usato l'output di Amaya come guida.

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

Uso Html.fromHtml

I tag HTML sono

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

Secondo le Documentazioni ufficiali di Android, tutti i tag nell'HTML verranno visualizzati come una stringa di sostituzione generica che il tuo programma può quindi passare e sostituire con stringhe reali .

Html.formHtmlIl metodo accetta un Html.TagHandlere un Html.ImageGetter come argomenti e il testo da analizzare.

Esempio

String Str_Html=" <p>This is about me text that the user can put into their profile</p> ";

Poi

Your_TextView_Obj.setText(Html.fromHtml(Str_Html).toString());

Produzione

Questo è il mio testo che l'utente può inserire nel proprio profilo


1
Nessuna utilità aggiuntiva e si allinea con Documenti Android. +1
davidbates

4

Ecco un'altra variante di come sostituire tutto (Tag HTML | Entità HTML | Spazio vuoto nel contenuto HTML)

content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", ""); dove il contenuto è una stringa.


1
L'ho migliorato un po ': {code} .replaceAll ("(<. *?>) | (&. * ?;)", "") .replaceAll ("\\ s {2,}", "") { code} Perché spesso quei tag sono proprio accanto al testo. E dopo aver rimosso i tag, cambia tutti i 2 e più spazi di scrittura in solo 1.
Ondřej Stašek

4

Puoi semplicemente utilizzare il filtro HTML predefinito di Android

    public String htmlToStringFilter(String textToFilter){

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

    }

Il metodo sopra restituirà la stringa filtrata HTML per l'input.


3

Un altro modo può essere quello di utilizzare com.google.gdata.util.common.html.HtmlToText come

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

Questo non è un codice a prova di proiettile e quando lo eseguo su voci di Wikipedia ricevo anche informazioni di stile. Tuttavia, credo che per piccoli / semplici lavori questo sarebbe efficace.


3

Sembra che tu voglia passare dall'HTML al semplice testo.
In tal caso, consultare www.htmlparser.org. Ecco un esempio che rimuove tutti i tag dal file html trovato in un URL.
Utilizza 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

Ecco un altro modo per farlo:

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

Oppure puoi semplicemente dire se (input.indexOf ("<")> 0 || input.indexOf (">")> 0) return ""; altrimenti restituisce input;
Hossein Shahdoost,

2

Si potrebbe anche usare Apache Tika per questo scopo. Per impostazione predefinita, conserva gli spazi bianchi dal codice HTML rimosso, che può essere desiderato in determinate situazioni:

InputStream htmlInputStream = ..
HtmlParser htmlParser = new HtmlParser();
HtmlContentHandler htmlContentHandler = new HtmlContentHandler();
htmlParser.parse(htmlInputStream, htmlContentHandler, new Metadata())
System.out.println(htmlContentHandler.getBodyText().trim())

1
Si noti che il metodo di analisi è deprecato a favore di Parse.parse(InputStream, ContentHandler, Metadata, ParseContext).
Jacob van Lingen,

1

Un modo per conservare le informazioni di nuova riga con JSoup è quello di precedere tutti i nuovi tag di linea con una stringa fittizia, eseguire JSoup e sostituire la stringa fittizia con "\ 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
Mentre questo frammento di codice può risolvere la domanda, inclusa una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Cerca anche di non aggiungere il tuo codice a commenti esplicativi, ciò riduce la leggibilità sia del codice che delle spiegazioni!
Filnor,

0

I miei 5 centesimi:

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

Per ottenere un semplice testo HTML formattato puoi farlo:

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/>");

Per formattare il testo in chiaro, cambia <br/> di \ n e cambia l'ultima riga di:

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

0

So che è passato un po 'di tempo da quando questa domanda è stata posta, ma ho trovato un'altra soluzione, questo è ciò che ha funzionato per me:

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

-1

puoi semplicemente creare un metodo con più sostituti All () come

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

Utilizzare questo collegamento per i sostituti più comuni necessari: http://tunes.org/wiki/html_20special_20characters_20and_20symbols.html

È semplice ma efficace. Uso prima questo metodo per rimuovere la posta indesiderata ma non la prima riga, ovvero sostituire All ("\ <. *?>", ""), E successivamente utilizzo parole chiave specifiche per cercare gli indici e quindi utilizzare .substring (inizio, fine ) metodo per eliminare le cose non necessarie. Poiché questo è più robusto e puoi individuare esattamente ciò di cui hai bisogno nell'intera pagina html.


4
Due note. Innanzitutto, questo non è ottimale: per ogni chiamata di ReplaceAll, Java tenterà di compilare il primo argomento come regex ed eseguirà l'intera stringa per applicare quel regex alla stringa, elaborando ogni volta qualche dozzina di KB per una normale pagina HTML. In secondo luogo, si consiglia di non utilizzare replaceAll per sostituire stringhe semplici (non regex), ma invece di sostituire replace () (che sostituisce anche tutto, a differenza del nome suggerito).
fwielstra,

-1

Rimuovi i tag HTML dalla stringa. Da qualche parte dobbiamo analizzare alcune stringhe che vengono ricevute da alcune risposte come Httpresponse dal server.

Quindi dobbiamo analizzarlo.

Qui mostrerò come rimuovere i tag html dalla stringa.

    // 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

Da dove vieni new System.Text.RegularExpressions.Regex();?
Beresfordt,

1
@beresfordt questa risposta si applica a .NET, non a Java come è stato richiesto nella domanda
Erin Drummond,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.