Вопрос-ответ

Remove HTML tags from a String

Удаление HTML-тегов из строки

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

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

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

Переведено автоматически
Ответ 1

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

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

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

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

Ответ 2

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

androidx.core.text.HtmlCompat.fromHtml(инструкция,HtmlCompat.FROM_HTML_MODE_LEGACY).toString()

Ответ 3

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

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

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

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

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

Ответ 4

Another way is to use javax.swing.text.html.HTMLEditorKit to extract the text.

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();
}
}
}
java regex