Удалить теги HTML из строки

422

Есть ли хороший способ удалить HTML из строки Java? Простое регулярное выражение типа

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

будет работать, но такие вещи, как не &amp;будут преобразованы правильно, и не-HTML между двумя угловыми скобками будут удалены (т.е. .*?в регулярном выражении исчезнет).

каменщик
источник
2
используйте это со следующим руководством: скомпилируйте 'org.jsoup: jsoup: 1.9.2'
Вахид Хосейни
1
stackoverflow.com/a/3149645/5733853
Вахид Хосейни
Смотрите также: stackoverflow.com/a/21838532/363573
Стефан

Ответы:

572

Используйте анализатор HTML вместо регулярных выражений. Это очень просто с Jsoup .

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

Jsoup также поддерживает удаление HTML-тегов из настраиваемого белого списка, что очень полезно, если вы хотите разрешить только, например <b>, <i>и <u>.

Смотрите также:

BalusC
источник
18
Jsoup хорош, но я столкнулся с некоторыми недостатками. Я использую его, чтобы избавиться от XSS, поэтому в основном я ожидаю ввода простого текста, но какой-то злой человек может попытаться отправить мне какой-нибудь HTML. Используя Jsoup, я могу удалить весь HTML, но, к сожалению, он также сокращает много пробелов до одного и удаляет разрывы ссылок (\ n символов)
Ridcully
7
@Ridcully: для этого вы хотели бы использовать Jsoup#clean()вместо.
BalusC
3
использование clean () все равно приведет к удалению лишних пробелов и \ n символов. например: Jsoup.clean ("a \ n b", Whitelist.none ()) возвращает "a b"
Кит
20
@ Zeroows: это с треском проваливается <p>Lorem ipsum 1 < 3 dolor sit amet</p>. Опять же, HTML не является обычным языком . Мне совершенно непонятно, почему все пытаются использовать регулярные выражения для анализа интересующих частей, вместо того, чтобы использовать настоящий анализатор.
BalusC
4
использовать Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));для сохранения
разрывов строк
275

Если вы пишете для Android, вы можете сделать это ...

android.text.Html.fromHtml(instruction).toString()
Кен Гудридж
источник
12
Потрясающий совет. :) Если вы отображаете текст в TextView, вы можете удалить .toString (), чтобы также сохранить некоторое форматирование.
Лорн Лалиберте
1
@Branky Это не я пытался ... принятый ответ работает как шарм
Maverick
Работает отлично. Все HTML-теги были удалены из строки.
user3144836
1
Это хорошо, но теги <img> заменены на некоторые странные вещи. Я получил маленькие квадраты, где было изображение
Bibaswann Bandyopadhyay
1
@BibaswannBandyopadhyay другой ответ помогает избавиться от этих персонажей
Винс
84

Если пользователь входит <b>hey!</b>, вы хотите отобразить <b>hey!</b>или hey!? Если первое, избегайте меньше чем, и закодируйте амперсанды html (и, возможно, кавычки), и все в порядке. Модификация вашего кода для реализации второго варианта будет:

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

но вы столкнетесь с проблемами, если пользователь введет что-то искаженное, например <bhey!</b>.

Вы также можете проверить JTidy, который проанализирует «грязный» ввод html и даст вам возможность удалить теги, сохраняя текст.

Проблема с удалением html заключается в том, что в браузерах есть очень снисходительные парсеры, более снисходительные, чем любая библиотека, которую вы можете найти, поэтому даже если вы сделаете все возможное, чтобы убрать все теги (используя метод замены выше, библиотеку DOM или JTidy) Вам все равно нужно будет убедиться, что все оставшиеся специальные символы HTML кодированы, чтобы обеспечить безопасность вывода.

Крис Марасти-Георг
источник
1
Вы также сталкиваетесь с проблемами, если в содержимом html-узла есть неэкранированный знак <или>. <span> Мой возраст - <много текста>, тогда ваш возраст </ span>. Я думаю, что только 100% способ сделать это через некоторый интерфейс XML DOM (например, SAX или аналогичный), чтобы использовать node.getText ().
Митя
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-теги из файла, чтобы извлечь только текст

RealHowTo
источник
5
Результатом «a <b или b> c» является «ab or b> c», что выглядит неудачно.
dfrankow
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
MiguelMunoz
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
Иерихон смог разобрать <br> до разрыва строки. Jsoup и HTMLEditorKit не могли этого сделать.
homaxto
Иерихон очень способен выполнять эту работу, часто использовал ее в собственных проектах.
Джерри Тян
3
Иерихон работал как шарм. Спасибо за предложение. Одно замечание: вам не нужно создавать сегмент всей строки. Источник расширяет сегмент, поэтому либо работает в конструкторе рендерера.
MrPlow
Джерико теперь, кажется, немного устарел (последний выпуск был 3.4 в конце 2015 года). Однако, если это все еще работает хорошо, тогда это все еще работает хорошо!
Джонатан Хульт
17

Принятый ответ на действия просто Jsoup.parse(html).text()имеет 2 потенциальных проблемы (с JSoup 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"}

Если вы найдете способ сделать это лучше, пожалуйста, дайте мне знать.

Damien
источник
2
Это не удастся против чего-то вроде &#38;lt;script&#38;gt;alert('Evil script executed');&#38;lt;/script&#38;gt;. То же самое и для &#x26;. JSoup не конвертирует &lt;script&gt; into <script>, это происходит потому, что вы вызываете StringEscapeUtils.unescapeHtmlпосле того, как JSoup очистил ввод.
Гийом Поле,
15

На Android попробуйте это:

String result = Html.fromHtml(html).toString();
Амин Махин
источник
Это сделал это! он удалил все встроенные HTML из текста :)
DritanX
1
Вы всегда используете фрагменты кода для нормального кода. Отрывки кода должны использоваться только для HTML, JavaScript или другого кода, который можно запустить в браузере. Вы не можете запустить Java в браузере. В будущем используйте обычные блоки кода ... Я отредактирую ваш ответ для вас на этот раз и исправлю форматирование и т. Д., Но, пожалуйста, не делайте этого больше в будущем. Это не первый раз, когда я рассказываю тебе об этом ...
Ксавер Капеллер
1
@PaulCroarkin это библиотека внутри Android SDK. android.text.Html
Амин Махин
1
Потрясающие. Удалены все HTML-теги.
user3144836
2
выглядит знакомо, как мой ответ от 2011 года.
Кен Гудридж
11

Экранирование HTML действительно трудно сделать правильно - я бы определенно предложил использовать библиотечный код, чтобы сделать это, так как он намного более тонкий, чем вы думаете. Проверьте Apache StringEscapeUtils для довольно хорошей библиотеки для обработки этого в Java.

Тим Хоулэнд
источник
Это то, что я ищу, но я хочу убрать HTML вместо того, чтобы избегать его.
Мейсон
Вы хотите удалить HTML или конвертировать его в обычный текст? Удаление HTML из длинной строки с тегами br и сущностями HTML может привести к неразборчивому беспорядку.
Тим Хоулэнд
4
StringEscapeUtils.unescapeHtml не удаляет html
Эрин Драммонд,
5
Хорошая информация об утилитах для использования, но не отвечает на вопрос.
Алекс
3
Запутанный ответ. Удаление! = Unescaping
Луис Мартинес
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.
Sandeep1699
источник
1
Как правило, ответы гораздо полезнее, если они содержат объяснение того, для чего предназначен код.
Питер
6

Вы можете заменить <br/>и </p>тег с строками до зачистки HTML , чтобы предотвратить его становится неразборчивым бардаком , как говорит Тим.

Единственный способ, с помощью которого я могу удалить теги HTML, но оставить не-HTML между угловыми скобками, - это проверить список тегов HTML . Что-то в этом роде ...

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

Затем HTML-декодирование специальных символов, таких как &amp;. Результат не следует считать санированным.

лисий
источник
5

В качестве альтернативы можно использовать HtmlCleaner :

private CharSequence removeHtmlFrom(String html) {
    return new HtmlCleaner().clean(html).getText();
}
Stephan
источник
2
HtmlCleaner работает хорошо, сохраняет разрывы строк и имеет недавний выпуск (2.21 в мае 2017 года).
Джонатан Хульт
4

Принятый ответ не помог мне в указанном мною тесте: результат "a <b или b> c" равен "ab or b> c".

Итак, я использовал TagSoup вместо этого. Вот снимок, который сработал для моего тестового примера (и нескольких других):

import java.io.IOException;
import java.io.StringReader;
import java.util.logging.Logger;

import org.ccil.cowan.tagsoup.Parser;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

/**
 * Take HTML and give back the text part while dropping the HTML tags.
 *
 * There is some risk that using TagSoup means we'll permute non-HTML text.
 * However, it seems to work the best so far in test cases.
 *
 * @author dan
 * @see <a href="http://home.ccil.org/~cowan/XML/tagsoup/">TagSoup</a> 
 */
public class Html2Text2 implements ContentHandler {
private StringBuffer sb;

public Html2Text2() {
}

public void parse(String str) throws IOException, SAXException {
    XMLReader reader = new Parser();
    reader.setContentHandler(this);
    sb = new StringBuffer();
    reader.parse(new InputSource(new StringReader(str)));
}

public String getText() {
    return sb.toString();
}

@Override
public void characters(char[] ch, int start, int length)
    throws SAXException {
    for (int idx = 0; idx < length; idx++) {
    sb.append(ch[idx+start]);
    }
}

@Override
public void ignorableWhitespace(char[] ch, int start, int length)
    throws SAXException {
    sb.append(ch);
}

// The methods below do not contribute to the text
@Override
public void endDocument() throws SAXException {
}

@Override
public void endElement(String uri, String localName, String qName)
    throws SAXException {
}

@Override
public void endPrefixMapping(String prefix) throws SAXException {
}


@Override
public void processingInstruction(String target, String data)
    throws SAXException {
}

@Override
public void setDocumentLocator(Locator locator) {
}

@Override
public void skippedEntity(String name) throws SAXException {
}

@Override
public void startDocument() throws SAXException {
}

@Override
public void startElement(String uri, String localName, String qName,
    Attributes atts) throws SAXException {
}

@Override
public void startPrefixMapping(String prefix, String uri)
    throws SAXException {
}
}
dfrankow
источник
4

Я знаю, что это старый, но я просто работал над проектом, который требовал от меня фильтрации HTML, и это работало нормально:

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

вместо этого:

html = html.replaceAll("&nbsp;","");
html = html.replaceAll("&amp;"."");
rqualis
источник
4

Вот немного более детальное обновление, чтобы попытаться обработать некоторое форматирование для разрывов и списков. Я использовал вывод Амайи в качестве руководства.

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

Вывод

Это обо мне текст, который пользователь может поместить в свой профиль

IntelliJ Amiya
источник
1
Никаких дополнительных утилит и выравнивание с Android Docs. +1
Давидбатес
4

Вот еще один вариант того, как заменить все (HTML-теги | HTML-объекты | Пустое пространство в содержимом HTML)

content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", ""); где содержимое является строкой.

silentsudo
источник
1
Я немного его улучшил: {code} .replaceAll ("(<. *?>) | (&. * ?;)", "") .replaceAll ("\\ s {2,}", "") { код} Потому что часто эти теги просто рядом с текстом. А после удаления тегов измените все 2 и более пространства записи на 1.
Ондржей Шашек
4

Вы можете просто использовать HTML-фильтр Android по умолчанию

    public String htmlToStringFilter(String textToFilter){

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

    }

Приведенный выше метод вернет отфильтрованную строку HTML для вашего ввода.

Анурагану Пуналур
источник
3

Еще один способ - использовать класс com.google.gdata.util.common.html.HtmlToText, например

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

Это не пуленепробиваемый код, и когда я запускаю его в записях википедии, я также получаю информацию о стиле. Однако я считаю, что для небольших / простых работ это будет эффективно.

rjha94
источник
3

Похоже, вы хотите перейти от HTML к простому тексту.
Если это так, посмотрите на www.htmlparser.org. Вот пример, который удаляет все теги из html-файла, найденного по URL.
Он использует 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
источник
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;
}
черная звезда
источник
Или вы можете просто сказать, если (input.indexOf ("<")> 0 || input.indexOf (">")> 0) return ""; иначе вернуть ввод;
Хоссейн Шахдуст
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(InputStream, ContentHandler, Metadata, ParseContext).
Джейкоб ван Линген
1

Один из способов сохранить информацию о новой строке с помощью JSoup - это предвосхитить все теги новой строки какой-нибудь фиктивной строкой, выполнить JSoup и заменить фиктивную строку на "\ n".

String html = "<p>Line one</p><p>Line two</p>Line three<br/>etc.";
String NEW_LINE_MARK = "NEWLINESTART1234567890NEWLINEEND";
for (String tag: new String[]{"</p>","<br/>","</h1>","</h2>","</h3>","</h4>","</h5>","</h6>","</li>"}) {
    html = html.replace(tag, NEW_LINE_MARK+tag);
}

String text = Jsoup.parse(html).text();

text = text.replace(NEW_LINE_MARK + " ", "\n\n");
text = text.replace(NEW_LINE_MARK, "\n\n");
RobMen
источник
1
classeString.replaceAll("\\<(/?[^\\>]+)\\>", "\\ ").replaceAll("\\s+", " ").trim() 
Гильерме Оливейра
источник
3
Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код. Также постарайтесь не переполнять ваш код пояснительными комментариями, это снижает удобочитаемость кода и пояснений!
Филнор
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/>");

Чтобы получить форматированный простой текст, измените <br/> на \ n и измените последнюю строку на:

nodeValue=nodeValue.replaceAll("(\\s*\n){3,}", "<br/><br/>");
surfealokesea
источник
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
Две заметки. Во-первых, это неоптимально - для каждого вызова replaceAll Java будет пытаться скомпилировать первый аргумент как регулярное выражение и выполнить всю строку, чтобы применить это регулярное выражение к строке, каждый раз обрабатывая несколько десятков КБ для обычной страницы HTML. Во-вторых, рекомендуется не использовать replaceAll для замены простых (не регулярных) строк, а вместо этого использовать replace () (которая также заменяет все, в отличие от предложенного названия).
fwielstra
-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();?
Бересфорд
1
@beresfordt этот ответ относится к .NET, а не к Java, как было запрошено в вопросе
Эрин Драммонд