Видаліть теги HTML із рядка


422

Чи є хороший спосіб видалити HTML із рядка Java? Простий регулярний вираз

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

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


2
скористайтеся цим наступним посібником: компілюйте 'org.jsoup: jsoup: 1.9.2'
VahidHoseini


Дивіться також: stackoverflow.com/a/21838532/363573
Стефан

Відповіді:


572

Використовуйте HTML-аналізатор замість регулярного вираження. Це просто мертво з Jsoup .

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

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

Дивись також:


18
Jsoup приємно, але я зіткнувся з деякими недоліками з цим. Я використовую його для позбавлення від XSS, тому в основному я очікую простого введення тексту, але якась зла людина може спробувати надіслати мені якийсь HTML. Використовуючи Jsoup, я можу видалити весь HTML, але, на жаль, він також скорочує багато пробілів до одного та видаляє розриви посилань (\ 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-теги були видалені з String.
користувач3144836

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-теги з файлу, щоб витягнути лише ТЕКСТ


5
Результатом "a <b або b> c" є "ab або 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
МігельМуноз

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
Єрихон зміг розібратися, щоб перервати лінію. Jsoup і HTMLEditorKit не могли цього зробити.
homaxto

Джерічо дуже здатний виконувати цю роботу, багато використовував її у власних проектах.
Джеррі Тіан

3
Єрихон працював як шарм. Дякую за пропозицію. Одна примітка: вам не потрібно створювати сегмент цілого рядка. Джерело розширює сегмент, тому будь-який працює в конструкторі Renderer.
MrPlow

Зараз Джеріко, здається, трохи датований (останній реліз був 3,4 в кінці 2015 року). Однак, якщо вона все-таки працює добре, то вона все одно працює добре!
Джонатан Хульт

17

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

Якщо ви знайдете спосіб зробити це краще, повідомте мене про це.


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-
файли

1
Ви завжди використовуєте фрагменти коду для звичайного коду. Фрагменти коду повинні використовуватися лише для HTML або JavaScript або іншого коду, який можна запустити в браузері. Ви не можете запустити Java у браузері. Використовуйте звичайні блоки коду в майбутньому ... Я цього разу відредагую вашу відповідь і виправлю форматування тощо, але, будь ласка, більше не робіть цього. Це не перший раз, коли я розповідав вам про це ...
Ксавер Капеллер

1
@PaulCroarkin - це бібліотека всередині Android sdk. android.text.Html
Амейн Мейхен

1
Дивовижно. Видалено всі теги html.
користувач3144836

2
виглядає знайомим, як моя відповідь від 2011 року
Кен Гудрідж

11

HTML Escaping насправді важко зробити правильно - я б напевно запропонував використовувати для цього код бібліотеки, оскільки це набагато тонкіше, ніж ви думаєте. Ознайомтеся з Apache's StringEscapeUtils щодо гарної бібліотеки для роботи з цим на Java.


Це щось таке, що я шукаю, але я хочу позбавити HTML, а не уникати його.
Мейсон

ви хочете зняти HTML, чи ви хочете перетворити його у звичайний текст? Зачистка HTML з довгих рядків з тегами br та елементами HTML може призвести до нерозбірливого безладу.
Тім Хоуленд

4
StringEscapeUtils.unescapeHtml не знімає html
Ерін Драммонд

5
Хороша інформація про утиліти, які слід використовувати для розмальовки, але не даючи відповіді на питання.
Олексій

3
Конфузна відповідь. Видалення! = Невизначення
Martinez

7

Це має працювати -

використовуй це

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

і це

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

1
Як правило, відповіді набагато корисніші, якщо вони включають пояснення того, що призначений для коду.
Пітер

6

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

Єдиним способом я можу придумати видалення тегів HTML, але залишати не-HTML між кутовими дужками - це перевірити наявність списку тегів HTML . Щось у цьому напрямку ...

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

Потім HTML-декодування спеціальних символів, таких як &amp;. Результат не слід вважати санітарним.


5

Крім того, можна використовувати HtmlCleaner :

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

2
HtmlCleaner працює добре, зберігає розриви рядків і має нещодавній випуск (2,21 у травні 2017 року).
Джонатан Хульт

4

Прийнята відповідь не спрацювала для мене в тестовому випадку, який я вказав: результат "a <b або b> c" - "ab або b> c".

Отже, я використав замість TagSoup. Ось знімок, який працював на моєму тестовому випадку (та на пару інших):

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

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

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

public Html2Text2() {
}

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

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

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

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

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

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

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


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

@Override
public void setDocumentLocator(Locator locator) {
}

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

@Override
public void startDocument() throws SAXException {
}

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

@Override
public void startPrefixMapping(String prefix, String uri)
    throws SAXException {
}
}

4

Я знаю, що це старе, але я просто працював над проектом, який вимагав від мене фільтрувати HTML, і це спрацювало чудово:

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

замість цього:

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

4

Ось трохи більш чітке оновлення, щоб спробувати обробити деяке форматування для перерв та списків. Я використовував вихід Amaya як керівництво.

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

import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;

public class HTML2Text extends HTMLEditorKit.ParserCallback {
    private static final Logger log = Logger
            .getLogger(Logger.GLOBAL_LOGGER_NAME);

    private StringBuffer stringBuffer;

    private Stack<IndexType> indentStack;

    public static class IndexType {
        public String type;
        public int counter; // used for ordered lists

        public IndexType(String type) {
            this.type = type;
            counter = 0;
        }
    }

    public HTML2Text() {
        stringBuffer = new StringBuffer();
        indentStack = new Stack<IndexType>();
    }

    public static String convert(String html) {
        HTML2Text parser = new HTML2Text();
        Reader in = new StringReader(html);
        try {
            // the HTML to convert
            parser.parse(in);
        } catch (Exception e) {
            log.severe(e.getMessage());
        } finally {
            try {
                in.close();
            } catch (IOException ioe) {
                // this should never happen
            }
        }
        return parser.getText();
    }

    public void parse(Reader in) throws IOException {
        ParserDelegator delegator = new ParserDelegator();
        // the third parameter is TRUE to ignore charset directive
        delegator.parse(in, this, Boolean.TRUE);
    }

    public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
        log.info("StartTag:" + t.toString());
        if (t.toString().equals("p")) {
            if (stringBuffer.length() > 0
                    && !stringBuffer.substring(stringBuffer.length() - 1)
                            .equals("\n")) {
                newLine();
            }
            newLine();
        } else if (t.toString().equals("ol")) {
            indentStack.push(new IndexType("ol"));
            newLine();
        } else if (t.toString().equals("ul")) {
            indentStack.push(new IndexType("ul"));
            newLine();
        } else if (t.toString().equals("li")) {
            IndexType parent = indentStack.peek();
            if (parent.type.equals("ol")) {
                String numberString = "" + (++parent.counter) + ".";
                stringBuffer.append(numberString);
                for (int i = 0; i < (4 - numberString.length()); i++) {
                    stringBuffer.append(" ");
                }
            } else {
                stringBuffer.append("*   ");
            }
            indentStack.push(new IndexType("li"));
        } else if (t.toString().equals("dl")) {
            newLine();
        } else if (t.toString().equals("dt")) {
            newLine();
        } else if (t.toString().equals("dd")) {
            indentStack.push(new IndexType("dd"));
            newLine();
        }
    }

    private void newLine() {
        stringBuffer.append("\n");
        for (int i = 0; i < indentStack.size(); i++) {
            stringBuffer.append("    ");
        }
    }

    public void handleEndTag(HTML.Tag t, int pos) {
        log.info("EndTag:" + t.toString());
        if (t.toString().equals("p")) {
            newLine();
        } else if (t.toString().equals("ol")) {
            indentStack.pop();
            ;
            newLine();
        } else if (t.toString().equals("ul")) {
            indentStack.pop();
            ;
            newLine();
        } else if (t.toString().equals("li")) {
            indentStack.pop();
            ;
            newLine();
        } else if (t.toString().equals("dd")) {
            indentStack.pop();
            ;
        }
    }

    public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
        log.info("SimpleTag:" + t.toString());
        if (t.toString().equals("br")) {
            newLine();
        }
    }

    public void handleText(char[] text, int pos) {
        log.info("Text:" + new String(text));
        stringBuffer.append(text);
    }

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

    public static void main(String args[]) {
        String html = "<html><body><p>paragraph at start</p>hello<br />What is happening?<p>this is a<br />mutiline paragraph</p><ol>  <li>This</li>  <li>is</li>  <li>an</li>  <li>ordered</li>  <li>list    <p>with</p>    <ul>      <li>another</li>      <li>list        <dl>          <dt>This</dt>          <dt>is</dt>            <dd>sdasd</dd>            <dd>sdasda</dd>            <dd>asda              <p>aasdas</p>            </dd>            <dd>sdada</dd>          <dt>fsdfsdfsd</dt>        </dl>        <dl>          <dt>vbcvcvbcvb</dt>          <dt>cvbcvbc</dt>            <dd>vbcbcvbcvb</dd>          <dt>cvbcv</dt>          <dt></dt>        </dl>        <dl>          <dt></dt>        </dl></li>      <li>cool</li>    </ul>    <p>stuff</p>  </li>  <li>cool</li></ol><p></p></body></html>";
        System.out.println(convert(html));
    }
}

4

Використовуйте Html.fromHtml

Теги HTML є

<a href=”…”> <b>,  <big>, <blockquote>, <br>, <cite>, <dfn>
<div align=”…”>,  <em>, <font size=”…” color=”…” face=”…”>
<h1>,  <h2>, <h3>, <h4>,  <h5>, <h6>
<i>, <p>, <small>
<strike>,  <strong>, <sub>, <sup>, <tt>, <u>

Згідно з офіційними документаціями Android будь-які теги в HTML будуть відображатися як загальна заміна рядка, яку ваша програма може потім пройти і замінити реальними рядками .

Html.formHtmlметод приймає Html.TagHandlerі Html.ImageGetter в якості аргументів, а також текст для розбору.

Приклад

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

Тоді

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

Вихідні дані

Це про мене текст, який користувач може розмістити у своєму профілі


1
Жодних додаткових утиліт та вирівнювань з Документами Android. +1
поділ

4

Ось ще один варіант заміни всіх (HTML-теги | HTML-елементи | Порожній пробіл у вмісті HTML)

content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", ""); де вміст - це рядок.


1
Я його трохи покращив: {code} .replaceAll ("(<. *?>) | (&. * ?;)", "") .replaceAll ("\\ s {2,}", "") { code} Тому що часто ці теги знаходяться поруч із текстом. А після видалення тегів змініть усі 2 та більше простору запису на лише 1.
Ondřej Stašek

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

Це не куленепробивний код, але коли я запускаю його у записах у Вікіпедії, я також отримую інформацію про стиль. Однак я вважаю, що для невеликих / простих робочих місць це буде ефективно.


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

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 ""; інше повернути вхід;
Hossein Shahdoost

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

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

0

Я знаю, що минуло певний час, як це питання було задано, але я знайшов інше рішення, ось що для мене спрацювало:

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

-1

ви можете просто зробити метод з декількома на зразок substituAll ()

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

Це просто, але ефективно. Я спочатку використовую цей метод, щоб видалити небажану, але не найперший рядок, тобто. ) метод зняти зайві речі. Оскільки це більш надійно, ви зможете точно вказати, що вам потрібно на всій html-сторінці.


4
Дві ноти. По-перше, це неоптимально - для кожного виклику substituAll Java спробує скомпілювати перший аргумент у вигляді регулярного вираження та пропустити через усю рядок, щоб застосувати цей регекс до рядка, обробляючи кілька десятків КБ на звичайній HTML-сторінці щоразу. По-друге, рекомендується не використовувати замінуAll для заміни простих рядків (не-регулярних виразів), а замість цього використовувати заміну () (що також замінює всі, на відміну від назви).
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();?
beresfordt

1
@beresfordt ця відповідь стосується .NET, а не Java, як запитували в запитанні
Ерін Драммонд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.