Удаление дескрипторов HTML в Java
Существует ли существующая библиотека Java, которая предоставляет метод для удаления всех тегов HTML из строки? Я ищу что-то, что эквивалентно функции strip_tags
в PHP.
Я знаю, что я могу использовать регулярное выражение, как описано в qaru.site/info/145104/..., однако мне было любопытно, может ли быть метод stripTags()
, плавающий где-то в используемую библиотеку Apache Commons.
Ответы
Ответ 1
После того, как этот вопрос откроется почти на неделю, я могу с уверенностью сказать, что в Java API или Apache-библиотеках нет метода, который удаляет теги HTML из String. Вы должны либо использовать парсер HTML, как описано в предыдущих ответах, либо написать простое регулярное выражение, чтобы вырезать теги.
Ответ 2
Используйте JSoup, он хорошо документирован, доступен на Maven и после дня проведения нескольких библиотек, для меня это самое лучшее, что я могу себе представить. Мое собственное мнение заключается в том, что такая работа, разглаживание html в виде простого текста, должна быть возможна в одной строке кода → иначе библиотека как-то потерпела неудачу... просто говоря ^^ So вот он, однострочный JSoup - в Markdown4J, что-то вроде этого невозможно в Markdownj тоже, в htmlCleaner это боль в попке с примерно 50 строками кода...
String plain = new HtmlToPlainText().getPlainText(Jsoup.parse(html));
И у вас есть реальный простой текст (а не только html-source-code как String, как в других libs lol) → он действительно отлично справляется с этим. Это более или менее такое же качество, как Markdownify for PHP....
Ответ 3
Это то, что я нашел в Google на нем.
Для меня это работало нормально.
String noHTMLString = htmlString.replaceAll("\\<.*?\\>", "");
Ответ 4
Независимо от того, что вы делаете, убедитесь, что вы нормализуете данные, прежде чем пытаетесь стричь теги. Недавно я посетил семинар по безопасности веб-приложений, который охватывал уклонение от фильтра XSS. Обычно можно было бы подумать, что поиск <
или <
или его шестиэквивалентного эквивалента будет достаточным. Я был потрясен, увидев слайд с 70 способами, которые <
может быть закодирован для извлечения фильтров.
Update:
Ниже представлена презентация, о которой я говорил, см. слайд 26 для 70 способов кодирования <
.
Уклонение фильтра: Houdini на проводе
Ответ 5
Возможно, что-то есть, но наиболее надежным является использование реального парсера HTML. Здесь один здесь, и если он достаточно хорошо сформирован, вы также можете использовать SAX или другой синтаксический анализатор XML.
Ответ 6
Я использовал nekoHtml для этого. Он может разделить все теги, но он может так же легко сохранить или разбить подмножество тегов.
Ответ 7
При использовании Jsoup это даже проще, чем описано выше:
String html = "bla <b>hehe</b> <br> this is awesome simple";
String text = Jsoup.parse(html).text();
Ответ 8
Я знаю, что этот вопрос довольно старый, но я тоже искал его, и кажется, что найти java-решение легко и просто нелегко.
Сегодня я столкнулся с этими небольшими функциями lib. Он фактически пытается имитировать функцию php strip_tags
.
http://jmelo.lyncode.com/java-strip_tags-php-function/
Он работает так (копируется со своего сайта):
import static com.lyncode.jtwig.functions.util.HtmlUtils.stripTags;
public class StripTagsExample {
public static void main(String... args) {
String result = stripTags("<!-- <a href='test'></a>--><a>Test</a>", "");
// Produced result: Test
}
}
Ответ 9
Привет, я знаю, что эта ветка старая, но она по-прежнему появилась в Google, и я искал быстрое решение этой проблемы. Не удалось найти что-нибудь полезное, поэтому я придумал этот фрагмент кода - надеюсь, что это поможет кому-то. Он просто перебирает строку и пропускает все теги. Простой и простой.
boolean intag = false;
String inp = "<H1>Some <b>HTML</b> <span style=blablabla>text</span>";
String outp = "";
for (int i=0; i < inp.length(); ++i)
{
if (!intag && inp.charAt(i) == '<')
{
intag = true;
continue;
}
if (intag && inp.charAt(i) == '>')
{
intag = false;
continue;
}
if (!intag)
{
outp = outp + inp.charAt(i);
}
}
return outp;
Ответ 10
С чистым итеративным подходом и без регулярного выражения:
public String stripTags(final String html) {
final StringBuilder sbText = new StringBuilder(1000);
final StringBuilder sbHtml = new StringBuilder(1000);
boolean isText = true;
for (char ch : html.toCharArray()) {
if (isText) { // outside html
if (ch != '<') {
sbText.append(ch);
continue;
} else { // switch mode
isText = false;
sbHtml.append(ch);
continue;
}
}else { // inside html
if (ch != '>') {
sbHtml.append(ch);
continue;
} else { // switch mode
isText = true;
sbHtml.append(ch);
continue;
}
}
}
return sbText.toString();
}
Ответ 11
Из-за аббревиатуры (обрезания строк) фрагмента html у меня также возникла проблема с открытыми тегами html, которые регулярное выражение не может обнаружить. Например:
Lorem ipsum dolor sit amet, <b>consectetur</b> adipiscing elit. <a href="abc"
Итак, ссылаясь на 2 лучших ответа (JSoup и regex), я предпочел решение с использованием JSoup:
Jsoup.parse(html).text()
Ответ 12
Wicket использует следующий метод для удаления html, расположенный в: org.apache.wicket.util.string.Strings
public static CharSequence escapeMarkup(final String s, final boolean escapeSpaces,
final boolean convertToHtmlUnicodeEscapes)
{
if (s == null)
{
return null;
}
else
{
int len = s.length();
final AppendingStringBuffer buffer = new AppendingStringBuffer((int)(len * 1.1));
for (int i = 0; i < len; i++)
{
final char c = s.charAt(i);
switch (c)
{
case '\t' :
if (escapeSpaces)
{
// Assumption is four space tabs (sorry, but that's
// just how it is!)
buffer.append(" ");
}
else
{
buffer.append(c);
}
break;
case ' ' :
if (escapeSpaces)
{
buffer.append(" ");
}
else
{
buffer.append(c);
}
break;
case '<' :
buffer.append("<");
break;
case '>' :
buffer.append(">");
break;
case '&' :
buffer.append("&");
break;
case '"' :
buffer.append(""");
break;
case '\'' :
buffer.append("'");
break;
default :
if (convertToHtmlUnicodeEscapes)
{
int ci = 0xffff & c;
if (ci < 160)
{
// nothing special only 7 Bit
buffer.append(c);
}
else
{
// Not 7 Bit use the unicode system
buffer.append("&#");
buffer.append(new Integer(ci).toString());
buffer.append(';');
}
}
else
{
buffer.append(c);
}
break;
}
}
return buffer;
}
}
Ответ 13
public static String stripTags(String str) {
int startPosition = str.indexOf('<');
int endPosition;
while (startPosition != -1) {
endPosition = str.indexOf('>', startPosition);
str = str.substring(0, startPosition) + (endPosition != -1 ? str.substring(endPosition + 1) : "");
startPosition = str.indexOf('<');
}
return str;
}