Есть ли хороший способ удалить HTML из строки Java? Простое регулярное выражение типа
replaceAll("\\<.*?>","")
будет работать, но такие вещи, как не &
будут преобразованы правильно, и не-HTML между двумя угловыми скобками будут удалены (т.е. .*?
в регулярном выражении исчезнет).
Ответы:
Используйте анализатор HTML вместо регулярных выражений. Это очень просто с Jsoup .
Jsoup также поддерживает удаление HTML-тегов из настраиваемого белого списка, что очень полезно, если вы хотите разрешить только, например
<b>
,<i>
и<u>
.Смотрите также:
источник
Jsoup#clean()
вместо.<p>Lorem ipsum 1 < 3 dolor sit amet</p>
. Опять же, HTML не является обычным языком . Мне совершенно непонятно, почему все пытаются использовать регулярные выражения для анализа интересующих частей, вместо того, чтобы использовать настоящий анализатор.Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));
для сохраненияЕсли вы пишете для Android, вы можете сделать это ...
источник
Если пользователь входит
<b>hey!</b>
, вы хотите отобразить<b>hey!</b>
илиhey!
? Если первое, избегайте меньше чем, и закодируйте амперсанды html (и, возможно, кавычки), и все в порядке. Модификация вашего кода для реализации второго варианта будет:но вы столкнетесь с проблемами, если пользователь введет что-то искаженное, например
<bhey!</b>
.Вы также можете проверить JTidy, который проанализирует «грязный» ввод html и даст вам возможность удалить теги, сохраняя текст.
Проблема с удалением html заключается в том, что в браузерах есть очень снисходительные парсеры, более снисходительные, чем любая библиотека, которую вы можете найти, поэтому даже если вы сделаете все возможное, чтобы убрать все теги (используя метод замены выше, библиотеку DOM или JTidy) Вам все равно нужно будет убедиться, что все оставшиеся специальные символы HTML кодированы, чтобы обеспечить безопасность вывода.
источник
Другой способ - использовать javax.swing.text.html.HTMLEditorKit для извлечения текста.
ref: Удалить HTML-теги из файла, чтобы извлечь только текст
источник
Я думаю, что самый простой способ фильтрации HTML-тегов:
источник
Также очень просто использовать Jericho , и вы можете сохранить часть форматирования (разрывы строк и ссылки, например).
источник
Принятый ответ на действия просто
Jsoup.parse(html).text()
имеет 2 потенциальных проблемы (с JSoup 1.7.3):<script>
в<script>
Если вы используете это для защиты от XSS, это немного раздражает. Вот мой лучший пример улучшенного решения с использованием JSoup и Apache StringEscapeUtils:
Обратите внимание, что последний шаг, потому что мне нужно использовать вывод в виде простого текста. Если вам нужен только вывод HTML, вы сможете удалить его.
И вот несколько тестов (входные и выходные данные):
Если вы найдете способ сделать это лучше, пожалуйста, дайте мне знать.
источник
&lt;script&gt;alert('Evil script executed');&lt;/script&gt;
. То же самое и для&
. JSoup не конвертирует<script> into <script>
, это происходит потому, что вы вызываетеStringEscapeUtils.unescapeHtml
после того, как JSoup очистил ввод.На Android попробуйте это:
источник
Экранирование HTML действительно трудно сделать правильно - я бы определенно предложил использовать библиотечный код, чтобы сделать это, так как он намного более тонкий, чем вы думаете. Проверьте Apache StringEscapeUtils для довольно хорошей библиотеки для обработки этого в Java.
источник
Это должно работать -
использовать этот
и это
источник
Вы можете заменить
<br/>
и</p>
тег с строками до зачистки HTML , чтобы предотвратить его становится неразборчивым бардаком , как говорит Тим.Единственный способ, с помощью которого я могу удалить теги HTML, но оставить не-HTML между угловыми скобками, - это проверить список тегов HTML . Что-то в этом роде ...
Затем HTML-декодирование специальных символов, таких как
&
. Результат не следует считать санированным.источник
В качестве альтернативы можно использовать HtmlCleaner :
источник
Принятый ответ не помог мне в указанном мною тесте: результат "a <b или b> c" равен "ab or b> c".
Итак, я использовал TagSoup вместо этого. Вот снимок, который сработал для моего тестового примера (и нескольких других):
источник
Я знаю, что это старый, но я просто работал над проектом, который требовал от меня фильтрации HTML, и это работало нормально:
вместо этого:
источник
Вот немного более детальное обновление, чтобы попытаться обработать некоторое форматирование для разрывов и списков. Я использовал вывод Амайи в качестве руководства.
источник
использование
Html.fromHtml
HTML- теги
В соответствии с официальной документацией Android любые теги в HTML будут отображаться как общая замещающая строка, через которую ваша программа может затем перейти и заменить ее настоящими строками .
Html.formHtml
Метод принимаетHtml.TagHandler
и Html.ImageGetter в качестве аргументов, а также текст для анализа.пример
затем
Вывод
Это обо мне текст, который пользователь может поместить в свой профиль
источник
Вот еще один вариант того, как заменить все (HTML-теги | HTML-объекты | Пустое пространство в содержимом HTML)
content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", "");
где содержимое является строкой.источник
Вы можете просто использовать HTML-фильтр Android по умолчанию
Приведенный выше метод вернет отфильтрованную строку HTML для вашего ввода.
источник
Еще один способ - использовать класс com.google.gdata.util.common.html.HtmlToText, например
Это не пуленепробиваемый код, и когда я запускаю его в записях википедии, я также получаю информацию о стиле. Однако я считаю, что для небольших / простых работ это будет эффективно.
источник
Похоже, вы хотите перейти от HTML к простому тексту.
Если это так, посмотрите на www.htmlparser.org. Вот пример, который удаляет все теги из html-файла, найденного по URL.
Он использует org.htmlparser.beans.StringBean .
источник
Вот еще один способ сделать это:
источник
Можно также использовать Apache Tika для этой цели. По умолчанию он сохраняет пробелы из раздетого html, которые могут быть желательны в определенных ситуациях:
источник
Parse.parse(InputStream, ContentHandler, Metadata, ParseContext)
.Один из способов сохранить информацию о новой строке с помощью JSoup - это предвосхитить все теги новой строки какой-нибудь фиктивной строкой, выполнить JSoup и заменить фиктивную строку на "\ n".
источник
источник
Мои 5 центов:
источник
Чтобы получить простой HTML-текст, вы можете сделать это:
Чтобы получить форматированный простой текст, измените <br/> на \ n и измените последнюю строку на:
источник
Я знаю, что прошло много времени с тех пор, как этот вопрос был задан, но я нашел другое решение, вот что сработало для меня:
источник
Вы можете просто сделать метод с несколькими replaceAll (), как
Используйте эту ссылку для наиболее распространенных замен, которые вам нужны: http://tunes.org/wiki/html_20special_20characters_20and_20symbols.html
Это просто, но эффективно. Сначала я использую этот метод для удаления ненужной, но не самой первой строки, т.е. replaceAll ("\ <. *?>", ""), А позже я использую определенные ключевые слова для поиска индексов, а затем использую .substring (start, end ) метод избавления от ненужных вещей. Поскольку это более надежно, и вы можете точно указать, что вам нужно на всей HTML-странице.
источник
Удалить теги HTML из строки. Где-то нам нужно проанализировать некоторую строку, полученную некоторыми ответами, такими как Httpresponse с сервера.
Поэтому нам нужно разобрать это.
Здесь я покажу, как удалить HTML-теги из строки.
источник
new System.Text.RegularExpressions.Regex();
?