Есть ли хороший способ удалить HTML из строки Java? Простое регулярное выражение типа
replaceAll("\\<.*?>", "")
будет работать, но некоторые вещи, такие как & не будут преобразованы правильно, и не HTML между двумя угловыми скобками будет удален (т. е. .*? В регулярном выражении исчезнет).
Переведено автоматически
Ответ 1
Используйте анализатор HTML вместо регулярных выражений. С Jsoup это предельно просто.
Jsoup также поддерживает удаление HTML-тегов из настраиваемого белого списка, что очень полезно, если вы хотите разрешить только, например, <b>, <i> и <u>.
Если пользователь вводит <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.
publicvoidparse(Reader in)throws IOException { s = newStringBuffer(); ParserDelegatordelegator=newParserDelegator(); // the third parameter is TRUE to ignore charset directive delegator.parse(in, this, Boolean.TRUE); }
publicvoidhandleText(char[] text, int pos) { s.append(text); }
public String getText() { return s.toString(); }
publicstaticvoidmain(String[] args) { try { // the HTML to convert FileReaderin=newFileReader("java-new.html"); Html2Textparser=newHtml2Text(); parser.parse(in); in.close(); System.out.println(parser.getText()); } catch (Exception e) { e.printStackTrace(); } } }