Remover tags HTML de uma String

422

Existe uma boa maneira de remover HTML de uma string Java? Uma regex simples como

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

funcionará, mas coisas como &amp;não serão convertidas corretamente e o HTML entre os dois colchetes angulares será removido (ou seja, o .*?no regex desaparecerá).

Pedreiro
fonte
2
use isso com o seguinte guia: compile 'org.jsoup: jsoup: 1.9.2'
VahidHoseini
Veja também: stackoverflow.com/a/21838532/363573
Stephan

Respostas:

572

Use um analisador de HTML em vez de regex. Isso é muito simples com o Jsoup .

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

O Jsoup também suporta a remoção de tags HTML em uma lista branca personalizável, o que é muito útil se você deseja permitir apenas <b>, por exemplo , <i>e <u>.

Veja também:

BalusC
fonte
18
Jsoup é legal, mas encontrei algumas desvantagens. Eu o uso para se livrar do XSS, então basicamente espero uma entrada de texto sem formatação, mas alguma pessoa má pode tentar me enviar um pouco de HTML. Usando Jsoup, posso remover todo o HTML, mas, infelizmente, também encolhe muitos espaços para um e remove links breaks (\ n caracteres)
Ridcully
7
@Ridcully: para isso você gostaria de usar Jsoup#clean().
precisa saber é o seguinte
3
usar clean () ainda fará com que espaços extras e \ n caracteres sejam removidos. ex: Jsoup.clean ("a \ n b", Whitelist.none ()) retorna "a b"
Keith
20
@ Zero: isso falha miseravelmente <p>Lorem ipsum 1 < 3 dolor sit amet</p>. Novamente, HTML não é uma linguagem comum . Está completamente além de mim que todo mundo tenta lançar regex nele para analisar partes de interesse em vez de usar um analisador real.
BalusC
4
usar Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));para preservar quebras de linha
Marc Johnen
275

Se você está escrevendo para Android, pode fazer isso ...

android.text.Html.fromHtml(instruction).toString()
Ken Goodridge
fonte
12
Dica incrível. :) Se você estiver exibindo o texto em um TextView, poderá soltar o .toString () para preservar algumas formatações também.
Lorne Laliberte
1
@Branky Não tentei ... a resposta aceita funciona como charme
Maverick
Funciona bem. Todas as tags html foram removidas da String.
user3144836
1
Isso é bom, mas as tags <img> são substituídas por algumas coisas bizarras. Eu tenho pequenos quadrados onde havia uma imagem
Bibaswann Bandyopadhyay
1
@BibaswannBandyopadhyay outra resposta ajuda a se livrar desses personagens
Vince
84

Se o usuário entrar <b>hey!</b>, você deseja exibir <b>hey!</b>ou hey!? Se o primeiro, escapar de e menos que e codificar html (e opcionalmente aspas) e você está bem. Uma modificação no seu código para implementar a segunda opção seria:

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

mas você terá problemas se o usuário inserir algo malformado, como <bhey!</b>.

Você também pode verificar o JTidy, que analisará a entrada html "suja" e deve fornecer uma maneira de remover as tags, mantendo o texto.

O problema ao tentar remover o html é que os navegadores têm analisadores muito branda, mais branda do que qualquer biblioteca que você encontrar, portanto, mesmo se você fizer o melhor para remover todas as tags (usando o método de substituição acima, uma biblioteca DOM ou JTidy) , você ainda precisará codificar os caracteres especiais HTML restantes para manter sua saída segura.

Chris Marasti-Georg
fonte
1
Você também enfrenta problemas, se houver um sinal <ou> sem escape dentro do conteúdo do nó html. <span> Minha idade é <muito texto>, e sua idade </span>. Eu acho que apenas 100% da maneira de fazer isso é através de alguma interface XML DOM (como SAX ou similar), para usar node.getText ().
Mitja Gustin
29

Outra maneira é usar o javax.swing.text.html.HTMLEditorKit para extrair o texto.

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: remova tags HTML de um arquivo para extrair apenas o texto

RealHowTo
fonte
5
O resultado de "a <b ou b> c" é "ab ou b> c", o que parece lamentável.
precisa saber é o seguinte
1
Isso funcionou melhor para mim. Eu precisava preservar quebras de linha. Eu fiz adicionando este método simples ao analisador: @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 expressão matemática a <b ou b> c deve ser escrita em html como este: a & lt; b ou b & gt; c
MiguelMunoz 18/02
24

Eu acho que a maneira mais simples de filtrar as tags 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("");
}
Sarja
fonte
18

Também é muito simples usando Jericó , e você pode reter parte da formatação (quebras de linha e links, por exemplo).

    Source htmlSource = new Source(htmlText);
    Segment htmlSeg = new Segment(htmlSource, 0, htmlSource.length());
    Renderer htmlRend = new Renderer(htmlSeg);
    System.out.println(htmlRend.toString());
Josh
fonte
4
Jericó foi capaz de analisar uma quebra de linha. Jsoup e HTMLEditorKit não puderam fazer isso.
precisa saber é o seguinte
Jericó é muito capaz de fazer esse trabalho, muito utilizado em projetos próprios.
Jerry Tian
3
Jericó trabalhou como um encanto. Obrigado pela sugestão. Uma observação: você não precisa criar um segmento de toda a cadeia. A origem estende o segmento, portanto, funciona no construtor Renderer.
MrPlow 02/09/2015
Jerico agora parece um pouco datado (a última versão foi 3.4 no final de 2015). No entanto, se ainda funcionar bem, ainda funcionará bem!
Jonathan Hult
17

A resposta aceita de fazer simplesmente Jsoup.parse(html).text()tem 2 problemas em potencial (com JSoup 1.7.3):

  • Remove quebras de linha do texto
  • Ele converte texto &lt;script&gt;em<script>

Se você usar isso para se proteger do XSS, isso é um pouco chato. Aqui está minha melhor chance de uma solução aprimorada, usando JSoup e 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);

Observe que o último passo é porque eu preciso usar a saída como texto sem formatação. Se você precisar apenas de saída HTML, poderá removê-la.

E aqui estão alguns casos de teste (entrada para saída):

{"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 você encontrar uma maneira de melhorar, informe-me.

Damien
fonte
2
Isso irá falhar contra algo como &#38;lt;script&#38;gt;alert('Evil script executed');&#38;lt;/script&#38;gt;. O mesmo vale para &#x26;. O JSoup não converte &lt;script&gt; into <script>, é o que faz porque você chama StringEscapeUtils.unescapeHtmldepois que o JSoup limpa a entrada.
Guillaume Polet
15

No Android, tente o seguinte:

String result = Html.fromHtml(html).toString();
Ameen Maheen
fonte
Isso foi feito! ele removeu toda html linha de texto :)
DritanX
1
Você está sempre usando trechos de código para código normal. Os snippets de código devem ser usados ​​apenas para HTML ou javascript ou outro código que possa ser executado no navegador. Você não pode executar o Java no navegador. Use blocos de código normais no futuro ... Vou editar sua resposta para você desta vez e corrigir a formatação, etc., mas não faça mais isso no futuro. Esta não é a primeira vez que eu disse a você sobre isso ...
Xaver Kapeller
1
@PaulCroarkin esta é a biblioteca dentro do android sdk. android.text.Html
Ameen Maheen
1
Impressionante. Removidas todas as tags html.
precisa saber é o seguinte
2
parece familiar, como a minha resposta a partir de 2011.
Ken Goodridge
11

Escapar de HTML é realmente difícil de fazer o certo - eu definitivamente sugeriria usar o código da biblioteca para fazer isso, pois é muito mais sutil do que você imagina. Confira o StringEscapeUtils do Apache para obter uma biblioteca muito boa para lidar com isso em Java.

Tim Howland
fonte
Esse é o tipo de coisa que estou procurando, mas quero retirar o HTML em vez de escapar dele.
Mason
você deseja remover o html ou deseja convertê-lo em texto sem formatação? Retirar o HTML de uma sequência longa com tags br e entidades HTML pode resultar em uma confusão ilegível.
Tim Howland
4
StringEscapeUtils.unescapeHtml não retira o html
Erin Drummond
5
Boas informações sobre os utils a serem usados ​​para tirar o escape, mas não responder à pergunta.
18714 Alex
3
Resposta confusa. Removendo! = Desescapando #
Lluis Martinez
7

Isso deve funcionar -

usa isto

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

e isto

  text.replaceAll('&.*?;' , "")-> this will replace all the tags which starts with "&" and ends with ";" like &nbsp;, &amp;, &gt; etc.
Sandeep1699
fonte
1
Geralmente, as respostas são muito mais úteis se incluirem uma explicação sobre o que o código pretende fazer.
Peter
6

Convém substituir <br/>e </p>marcar com novas linhas antes de remover o HTML para evitar que ele se torne uma bagunça ilegível, como Tim sugere.

A única maneira de pensar em remover tags HTML, mas deixar não HTML entre colchetes angulares, seria comparar uma lista de tags HTML . Algo nesse sentido ...

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

Em seguida, decodifique caracteres especiais como HTML &amp;. O resultado não deve ser considerado higienizado.

foxy
fonte
5

Como alternativa, pode-se usar o HtmlCleaner :

private CharSequence removeHtmlFrom(String html) {
    return new HtmlCleaner().clean(html).getText();
}
Stephan
fonte
2
O HtmlCleaner funciona bem, mantém as quebras de linha e tem um lançamento recente (2,21 em maio de 2017).
Jonathan Hult
4

A resposta aceita não funcionou para mim no caso de teste que eu indiquei: o resultado de "a <b ou b> c" é "ab ou b> c".

Então, eu usei o TagSoup. Aqui está uma foto que funcionou para o meu caso de teste (e mais alguns):

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 {
}
}
dfrankow
fonte
4

Eu sei que isso é antigo, mas eu estava trabalhando em um projeto que exigia a filtragem de HTML e isso funcionou bem:

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

em vez disso:

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

Aqui está uma atualização levemente mais detalhada para tentar lidar com alguma formatação de pausas e listas. Eu usei a saída de Amaya como um guia.

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));
    }
}
Mike
fonte
4

Usar Html.fromHtml

Tags HTML são

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

De acordo com as Documentações oficiais do Android, qualquer tag no HTML será exibida como uma String genérica de substituição, que o seu programa poderá passar e substituir por strings reais .

Html.formHtmlO método leva um Html.TagHandlere um Html.ImageGetter como argumentos, bem como o texto para analisar.

Exemplo

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

Então

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

Resultado

Trata-se de um texto que o usuário pode colocar em seu perfil

IntelliJ Amiya
fonte
1
Não há utilitários extras e se alinha com o Android Docs. 1
davidbates 30/03
4

Aqui está mais uma variante de como substituir tudo (Tags HTML | Entidades HTML | Espaço vazio no conteúdo HTML)

content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", ""); onde o conteúdo é uma String.

silentsudo
fonte
1
Eu melhorei um pouco: {code} .replaceAll ("(<. *?>) | (&. * ?;)", "") .replaceAll ("\\ s {2,}", "") { código} Porque geralmente essas tags estão próximas ao texto. E depois de remover as tags mudar todos os 2 e mais writespaces para apenas 1.
Ondřej Stasek
4

Você pode simplesmente usar o filtro HTML padrão do Android

    public String htmlToStringFilter(String textToFilter){

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

    }

O método acima retornará a string filtrada em HTML para sua entrada.

Anuraganu Punalur
fonte
3

Mais uma maneira pode ser usar a classe com.google.gdata.util.common.html.HtmlToText como

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

Porém, este não é um código à prova de balas e, quando o executo nas entradas da Wikipedia, também estou recebendo informações de estilo. No entanto, acredito que para trabalhos pequenos / simples isso seria eficaz.

rjha94
fonte
3

Parece que você deseja ir do HTML para o texto sem formatação.
Se for esse o caso, consulte www.htmlparser.org. Aqui está um exemplo que retira todas as tags do arquivo html encontrado em uma URL.
Ele usa org.htmlparser.beans.StringBean .

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

Aqui está outra maneira de fazer isso:

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;
}
estrela Negra
fonte
Ou você pode apenas dizer, se (input.indexOf ("<")> 0 || input.indexOf (">")> 0) return ""; else retornará entrada;
Hossein Shahdoost
2

Pode-se também usar o Apache Tika para esse fim. Por padrão, ele preserva os espaços em branco do html removido, o que pode ser desejado em determinadas situações:

InputStream htmlInputStream = ..
HtmlParser htmlParser = new HtmlParser();
HtmlContentHandler htmlContentHandler = new HtmlContentHandler();
htmlParser.parse(htmlInputStream, htmlContentHandler, new Metadata())
System.out.println(htmlContentHandler.getBodyText().trim())
Maksim Sorokin
fonte
1
Observe que o método de análise foi preterido em favor de Parse.parse(InputStream, ContentHandler, Metadata, ParseContext).
Jacob van Lingen
1

Uma maneira de reter informações de nova linha com JSoup é preceder todas as novas tags de linha com alguma sequência fictícia, executar JSoup e substituir a seqüência fictícia por "\ 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");
RobMen
fonte
1
classeString.replaceAll("\\<(/?[^\\>]+)\\>", "\\ ").replaceAll("\\s+", " ").trim() 
Guilherme Oliveira
fonte
3
Embora esse trecho de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não saber os motivos da sua sugestão de código. Tente também não sobrecarregar seu código com comentários explicativos, pois isso reduz a legibilidade do código e das explicações!
Filnor
0

Meus 5 centavos:

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);
}
Alexander
fonte
0

Para obter texto html simples formatado, você pode fazer isso:

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

Para obter o texto sem formatação, altere <br/> por \ n e altere a última linha por:

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

Eu sei que já faz um tempo desde que essa pergunta foi feita, mas encontrei outra solução, e foi isso que funcionou para mim:

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

você pode simplesmente criar um método com vários replaceAll () como

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

Use este link para as substituições mais comuns que você precisa: http://tunes.org/wiki/html_20special_20characters_20and_20symbols.html

É simples, mas eficaz. Eu uso esse método primeiro para remover o lixo eletrônico, mas não a primeira linha, ou seja, replaceAll ("\ <. *?>", "") E, posteriormente, uso palavras-chave específicas para pesquisar índices e, em seguida, usar .substring (start, end ) para remover coisas desnecessárias. Como isso é mais robusto e você pode apontar exatamente o que precisa em toda a página html.

Rizwan
fonte
4
Duas notas. Primeiro, isso é subótimo - para cada chamada replaceAll, o Java tenta compilar o primeiro argumento como uma regex e percorre toda a cadeia para aplicar essa regex à cadeia, processando algumas dúzias de KB para uma página HTML regular todas as vezes. Segundo, é aconselhável não usar replaceAll para substituir cadeias simples (sem regex), mas usar replace () (que também substitui tudo, ao contrário do que o nome sugere).
Fwielstra
-1

Remova as tags HTML da string. Em algum lugar, precisamos analisar alguma string que é recebida por algumas respostas como Httpresponse do servidor.

Então, precisamos analisá-lo.

Aqui vou mostrar como remover tags html da string.

    // 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
Satya Prakash
fonte
De onde você new System.Text.RegularExpressions.Regex();vem?
beresfordt
1
@beresfordt esta resposta se aplica a NET, não Java, como foi solicitado na pergunta
Erin Drummond