Eliminar etiquetas HTML de una cadena

422

¿Hay una buena manera de eliminar HTML de una cadena Java? Una expresión regular simple como

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

funcionará, pero cosas como &amp;no se convertirán correctamente y no HTML entre los dos corchetes angulares se eliminará (es decir .*?, desaparecerá la expresión regular).

Masón
fuente
2
use esto con la siguiente guía: compile 'org.jsoup: jsoup: 1.9.2'
VahidHoseini
Ver también: stackoverflow.com/a/21838532/363573
Stephan

Respuestas:

572

Use un analizador HTML en lugar de expresiones regulares. Esto es muy simple con Jsoup .

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

Jsoup también admite la eliminación de etiquetas HTML en una lista blanca personalizable, lo cual es muy útil si desea permitir solo <b>, por ejemplo , <i>y <u>.

Ver también:

BalusC
fuente
18
Jsoup es agradable, pero me encontré con algunos inconvenientes. Lo uso para deshacerme de XSS, así que básicamente espero una entrada de texto sin formato, pero alguna persona malvada podría intentar enviarme algo de HTML. Usando Jsoup, puedo eliminar todo el HTML pero, desafortunadamente, también reduce muchos espacios a uno y elimina los saltos de enlace (\ n caracteres)
Ridcully
77
@Ridcully: para eso te gustaría usar Jsoup#clean()en su lugar.
BalusC
3
el uso de clean () seguirá causando espacios adicionales y \ n caracteres que se eliminarán. ej .: Jsoup.clean ("a \ n b", Whitelist.none ()) devuelve "a b"
Keith
20
@Zeroows: esto falla miserablemente <p>Lorem ipsum 1 < 3 dolor sit amet</p>. Nuevamente, HTML no es un lenguaje normal . Está completamente fuera de mi alcance por qué todos siguen tratando de arrojar expresiones regulares para analizar partes de interés en lugar de usar un analizador real.
BalusC
44
usar Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));para preservar saltos de línea
Marc Johnen
275

Si estás escribiendo para Android , puedes hacer esto ...

android.text.Html.fromHtml(instruction).toString()
Ken Goodridge
fuente
12
Consejo impresionante :) Si está mostrando el texto en TextView, también puede soltar .toString () para preservar algo de formato.
Lorne Laliberte
1
@Branky No lo he intentado ... la respuesta aceptada funciona a las mil maravillas
Maverick
Funciona genial. Todas las etiquetas html se eliminaron de la cadena.
user3144836
1
Esto es bueno, pero las etiquetas <img> se reemplazan con algunas cosas extrañas.
Obtuve
1
@BibaswannBandyopadhyay otra respuesta ayuda a deshacerse de estos personajes
Vince
84

Si el usuario ingresa <b>hey!</b>, ¿quiere mostrar <b>hey!</b>o hey!? Si es el primero, escape menos-thans y html-codifique símbolos (y opcionalmente comillas) y estará bien. Una modificación a su código para implementar la segunda opción sería:

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

pero se encontrará con problemas si el usuario ingresa algo mal formado, como <bhey!</b>.

También puede consultar JTidy, que analizará la entrada html "sucia", y debería darle una forma de eliminar las etiquetas, manteniendo el texto.

El problema al intentar eliminar html es que los navegadores tienen analizadores muy indulgentes, más indulgentes que cualquier biblioteca que pueda encontrar, por lo que incluso si hace todo lo posible para eliminar todas las etiquetas (utilizando el método de reemplazo anterior, una biblioteca DOM o JTidy) , aún deberá asegurarse de codificar los caracteres especiales HTML restantes para mantener su salida segura.

Chris Marasti-Georg
fuente
1
También se encuentra con problemas, si hay un signo <o> sin escape dentro del contenido del nodo html. <span> Mi edad es <mucho texto> entonces tu edad </span>. Creo que solo el 100% de la forma de hacerlo es a través de alguna interfaz XML DOM (como SAX o similar), para usar node.getText ().
Mitja Gustin
29

Otra forma es usar javax.swing.text.html.HTMLEditorKit para extraer el 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: Eliminar etiquetas HTML de un archivo para extraer solo el TEXTO

RealHowTo
fuente
55
El resultado de "a <b o b> c" es "ab o b> c", lo que parece desafortunado.
dfrankow
1
Esto funcionó mejor para mí. Necesitaba preservar los saltos de línea. Lo hice agregando este método simple al analizador: @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: la expresión matemática a <b o b> c debería escribirse en html de esta manera: a & lt; b o b & gt; c
Miguel Muñoz
24

Creo que la forma más sencilla de filtrar las etiquetas html es:

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("");
}
Sarga
fuente
18

También es muy simple con Jericho , y puede conservar parte del formato (saltos de línea y enlaces, por ejemplo).

    Source htmlSource = new Source(htmlText);
    Segment htmlSeg = new Segment(htmlSource, 0, htmlSource.length());
    Renderer htmlRend = new Renderer(htmlSeg);
    System.out.println(htmlRend.toString());
Josh
fuente
44
Jericho pudo analizar un salto de línea. Jsoup y HTMLEditorKit no pudieron hacer eso.
homaxto
Jericho es muy capaz de hacer este trabajo, lo usó mucho en proyectos propios.
Jerry Tian
3
Jericho trabajó como un encanto. Gracias por la sugerencia. Una nota: no tiene que crear un segmento de toda la cadena. Source extiende Segment, por lo que cualquiera de los dos funciona en el constructor Renderer.
MrPlow
Jerico ahora parece estar un poco anticuado (el último lanzamiento fue 3.4 a finales de 2015). Sin embargo, si aún funciona bien, ¡aún funciona bien!
Jonathan Hult
17

La respuesta aceptada de hacer simplemente Jsoup.parse(html).text()tiene 2 problemas potenciales (con JSoup 1.7.3):

  • Elimina los saltos de línea del texto.
  • Convierte texto &lt;script&gt;en<script>

Si usa esto para protegerse contra XSS, esto es un poco molesto. Aquí está mi mejor oportunidad de obtener una solución mejorada, utilizando JSoup y 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);

Tenga en cuenta que el último paso es porque necesito usar la salida como texto sin formato. Si solo necesita salida HTML, entonces debería poder eliminarla.

Y aquí hay un montón de casos de prueba (entrada a salida):

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

Si encuentra una manera de mejorarlo, hágamelo saber.

Damien
fuente
2
Esto fallará en contra de algo así &#38;lt;script&#38;gt;alert('Evil script executed');&#38;lt;/script&#38;gt;. Lo mismo vale para &#x26;. JSoup no convierte &lt;script&gt; into <script>, lo hace porque llama StringEscapeUtils.unescapeHtmldespués de que JSoup limpiara la entrada.
Guillaume Polet
15

En Android, intente esto:

String result = Html.fromHtml(html).toString();
Ameen Maheen
fuente
Esto lo hizo! eliminó todo el html en línea del texto :)
DritanX
1
Siempre está utilizando fragmentos de código para el código normal. Se supone que los fragmentos de código solo se usan para HTML o JavaScript u otro código que se pueda ejecutar en el navegador. No puede ejecutar Java en el navegador. Use bloques de código normales en el futuro ... Editaré su respuesta por usted esta vez y arreglaré el formato, etc., pero no lo haga más en el futuro. Esta no es la primera vez que te cuento sobre esto ...
Xaver Kapeller
1
@PaulCroarkin esta es la biblioteca dentro de Android SDK. android.text.Html
Ameen Maheen
1
Increíble. Se eliminaron todas las etiquetas html.
user3144836
2
parece familiar, como mi respuesta de 2011.
Ken Goodridge
11

HTML Escaping es realmente difícil de hacer bien, definitivamente sugeriría usar el código de la biblioteca para hacer esto, ya que es mucho más sutil de lo que piensas. Echa un vistazo a StringEscapeUtils de Apache para obtener una biblioteca bastante buena para manejar esto en Java.

Tim Howland
fuente
Este es el tipo de cosas que estoy buscando, pero quiero quitar el HTML en lugar de escapar.
Mason
¿Desea eliminar el html o desea convertirlo a texto sin formato? Eliminar el HTML de una cadena larga con etiquetas br y entidades HTML puede resultar en un lío ilegible.
Tim Howland
44
StringEscapeUtils.unescapeHtml no elimina html
Erin Drummond
55
Buena información sobre las utilidades para usar para escapar pero no responder la pregunta.
Alex
3
Respuesta confusa Removing! = Unescaping
Lluis Martinez
7

Esto debería funcionar -

utilizar este

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

y esto

  text.replaceAll('&.*?;' , "")-> this will replace all the tags which starts with "&" and ends with ";" like &nbsp;, &amp;, &gt; etc.
Sandeep1699
fuente
1
En general, las respuestas son mucho más útiles si incluyen una explicación de lo que se pretende que haga el código.
Peter
6

Es posible que desee reemplazar <br/>y </p>etiquetar con nuevas líneas antes de quitar el HTML para evitar que se convierta en un lío ilegible, como sugiere Tim.

La única forma en que puedo pensar en eliminar las etiquetas HTML pero dejando que no sea HTML entre paréntesis angulares sería verificar una lista de etiquetas HTML . Algo en este sentido ...

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

Luego, decodifique HTML caracteres especiales como &amp;. El resultado no debe considerarse como desinfectado.

astuto
fuente
5

Alternativamente, uno puede usar HtmlCleaner :

private CharSequence removeHtmlFrom(String html) {
    return new HtmlCleaner().clean(html).getText();
}
Stephan
fuente
2
HtmlCleaner funciona bien, mantiene saltos de línea y tiene un lanzamiento reciente (2.21 en mayo de 2017).
Jonathan Hult
4

La respuesta aceptada no funcionó para mí para el caso de prueba que indiqué: el resultado de "a <b o b> c" es "ab o b> c".

Entonces, usé TagSoup en su lugar. Aquí hay una foto que funcionó para mi caso de prueba (y un par de otros):

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

Sé que esto es viejo, pero solo estaba trabajando en un proyecto que me requería filtrar HTML y funcionó bien:

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

en lugar de esto:

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

Aquí hay una actualización un poco más desarrollada para tratar de manejar algunos formatos para saltos y listas. Usé la salida de Amaya como guía.

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));
    }
}
Miguel
fuente
4

Utilizar Html.fromHtml

Las etiquetas HTML son

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

Según las Documentaciones oficiales de Android, cualquier etiqueta en el HTML se mostrará como una Cadena de reemplazo genérica que su programa puede revisar y reemplazar con cadenas reales .

Html.formHtmlEl método toma un Html.TagHandlery un Html.ImageGetter como argumentos, así como el texto para analizar.

Ejemplo

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

Entonces

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

Salida

Se trata de un mensaje de texto que el usuario puede poner en su perfil.

IntelliJ Amiya
fuente
1
No hay utilidades adicionales y se alinea con Android Docs. +1
davidbates
4

Aquí hay una variante más de cómo reemplazar todo (Etiquetas HTML | Entidades HTML | Espacio vacío en contenido HTML)

content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", ""); donde el contenido es una cadena.

silentsudo
fuente
1
Lo mejoré un poco: {code} .replaceAll ("(<. *?>) | (&. * ?;)", "") .replaceAll ("\\ s {2,}", "") { código} Porque a menudo esas etiquetas están justo al lado del texto. Y después de eliminar las etiquetas, cambie los 2 y más espacios de escritura a solo 1.
Ondřej Stašek
4

Simplemente puede usar el filtro HTML predeterminado de Android

    public String htmlToStringFilter(String textToFilter){

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

    }

El método anterior devolverá la cadena filtrada de HTML para su entrada.

Anuraganu Punalur
fuente
3

Una forma más puede ser usar la clase com.google.gdata.util.common.html.HtmlToText como

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

Sin embargo, este no es un código a prueba de balas y cuando lo ejecuto en las entradas de wikipedia también obtengo información de estilo. Sin embargo, creo que para trabajos pequeños / simples esto sería efectivo.

rjha94
fuente
3

Parece que quiere pasar de HTML a texto sin formato.
Si ese es el caso, visite www.htmlparser.org. Aquí hay un ejemplo que elimina todas las etiquetas del archivo html que se encuentra en una URL.
Hace uso de 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
fuente
2

Aquí hay otra forma de hacerlo:

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;
}
estrella negra
fuente
O simplemente puede decir, if (input.indexOf ("<")> 0 || input.indexOf (">")> 0) return ""; más entrada de retorno;
Hossein Shahdoost
2

También se podría usar Apache Tika para este propósito. De forma predeterminada, conserva espacios en blanco del HTML despojado, lo que puede desearse en ciertas situaciones:

InputStream htmlInputStream = ..
HtmlParser htmlParser = new HtmlParser();
HtmlContentHandler htmlContentHandler = new HtmlContentHandler();
htmlParser.parse(htmlInputStream, htmlContentHandler, new Metadata())
System.out.println(htmlContentHandler.getBodyText().trim())
Maksim Sorokin
fuente
1
Tenga en cuenta que el método de análisis está en desuso a favor de Parse.parse(InputStream, ContentHandler, Metadata, ParseContext).
Jacob van Lingen
1

Una forma de retener información de nueva línea con JSoup es preceder todas las nuevas etiquetas de línea con alguna cadena ficticia, ejecutar JSoup y reemplazar la cadena ficticia 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");
RobMen
fuente
1
classeString.replaceAll("\\<(/?[^\\>]+)\\>", "\\ ").replaceAll("\\s+", " ").trim() 
Guilherme Oliveira
fuente
3
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código. Por favor, trate de no saturar su código con comentarios explicativos, ¡esto reduce la legibilidad tanto del código como de las explicaciones!
Filnor
0

Mis 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);
}
Alejandro
fuente
0

Para obtener texto HTML simple con formato , puede hacer eso:

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 obtener formato de texto sin formato, cambie <br/> por \ ny cambie la última línea por:

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

Sé que ha pasado un tiempo desde que se hizo esta pregunta, pero encontré otra solución, esto es lo que funcionó para mí:

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

simplemente puede hacer un método con varios replaceAll () como

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

Use este enlace para los reemplazos más comunes que necesita: http://tunes.org/wiki/html_20special_20characters_20and_20symbols.html

Es simple, pero efectivo. Uso este método primero para eliminar la basura pero no la primera línea, es decir, reemplazar todo ("\ <. *?>", ""), Y luego uso palabras clave específicas para buscar índices y luego uso .substring (inicio, fin ) método para eliminar cosas innecesarias. Como esto es más robusto y puede señalar exactamente lo que necesita en toda la página html.

Rizwan
fuente
44
Dos notas Primero, esto es subóptimo: para cada llamada replaceAll, Java intentará compilar el primer argumento como una expresión regular y ejecutará toda la cadena para aplicar esa expresión regular a la cadena, procesando unas pocas docenas de KB para una página HTML normal cada vez. En segundo lugar, se recomienda no usar replaceAll para reemplazar cadenas simples (no regex), sino usar replace () (que también reemplaza todo, a diferencia del nombre sugiere).
fwielstra
-1

Eliminar etiquetas HTML de la cadena. En algún lugar necesitamos analizar alguna cadena que es recibida por algunas respuestas como Httpresponse del servidor.

Por lo tanto, debemos analizarlo.

Aquí mostraré cómo eliminar etiquetas html de la cadena.

    // 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
fuente
¿De dónde sacas new System.Text.RegularExpressions.Regex();?
beresfordt
1
@beresfordt esta respuesta se aplica a .NET, no a Java como se solicitó en la pregunta
Erin Drummond