Подтвердить что ты не робот

Удаление дескрипторов HTML в Java

Существует ли существующая библиотека Java, которая предоставляет метод для удаления всех тегов HTML из строки? Я ищу что-то, что эквивалентно функции strip_tags в PHP.

Я знаю, что я могу использовать регулярное выражение, как описано в qaru.site/info/145104/..., однако мне было любопытно, может ли быть метод stripTags(), плавающий где-то в используемую библиотеку Apache Commons.

4b9b3361

Ответ 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. Обычно можно было бы подумать, что поиск < или &lt; или его шестиэквивалентного эквивалента будет достаточным. Я был потрясен, увидев слайд с 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("&nbsp;&nbsp;&nbsp;&nbsp;");
                    }
                    else
                    {
                        buffer.append(c);
                    }
                    break;

                case ' ' :
                    if (escapeSpaces)
                    {
                        buffer.append("&nbsp;");
                    }
                    else
                    {
                        buffer.append(c);
                    }
                    break;

                case '<' :
                    buffer.append("&lt;");
                    break;

                case '>' :
                    buffer.append("&gt;");
                    break;

                case '&' :

                    buffer.append("&amp;");
                    break;

                case '"' :
                    buffer.append("&quot;");
                    break;

                case '\'' :
                    buffer.append("&#039;");
                    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;
}