Удаление HTML-тегов в Java - PullRequest
40 голосов
/ 07 мая 2009

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

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

Ответы [ 13 ]

33 голосов
/ 17 июля 2013

Используйте JSoup , это хорошо документировано, доступно на Maven и после дня, проведенного с несколькими библиотеками, для меня это лучшее, что я могу себе представить ... Мое собственное мнение, что такая работа, как разбор html в обычный текст, должна быть возможна в одной строке кода -> иначе библиотека как-то не справится ... просто говоря ^^ Так что вот, однострочная строка JSoup - в Markdown4J, что-то как это невозможно, и в Markdownj, в htmlCleaner это боль в заднице с примерно 50 строками кода ...

String plain = new HtmlToPlainText().getPlainText(Jsoup.parse(html));

И то, что вы получили, это настоящий простой текст (не просто html-исходный код в виде String, как в других библиотеках LOL) -> он действительно отлично справляется с этим. Это более или менее такое же качество, как Markdownify для PHP ....

29 голосов
/ 27 ноября 2011

Это то, что я нашел в Google на нем. Для меня это работало нормально.

String noHTMLString = htmlString.replaceAll("\\<.*?\\>", "");
29 голосов
/ 07 мая 2009

Что бы вы ни делали, убедитесь, что вы нормализуете данные, прежде чем пытаться удалить теги. Недавно я посетил семинар по безопасности веб-приложений, посвященный уклонению от фильтров XSS. Можно было бы подумать, что будет достаточно поиска < или &lt; или его шестнадцатеричного эквивалента. Я был поражен, увидев слайд с 70 способами, которыми < может быть закодирован для фильтров ударов.

Обновление:

Ниже приведена презентация, на которую я ссылался, см. Слайд 26 для 70 способов кодирования <.

Уклонение фильтра: Гудини на проводе

11 голосов
/ 13 мая 2009

После того, как этот вопрос был открыт в течение почти недели, я могу с уверенностью сказать, что в библиотеках Java API или Apache нет метода, который удаляет HTML-теги из строки. Вам придется либо использовать анализатор HTML, как описано в предыдущих ответах, либо написать простое регулярное выражение для удаления тегов.

11 голосов
/ 07 мая 2009

Могут быть некоторые, но самое надежное - использовать настоящий HTML-парсер. Здесь есть один , и, если он достаточно хорошо сформирован, вы также можете использовать SAX или другой анализатор XML.

7 голосов
/ 26 ноября 2014

При использовании Jsoup это даже проще, чем описано в ответах выше:

String html = "bla <b>hehe</b> <br> this is awesome simple";

String text = Jsoup.parse(html).text();
6 голосов
/ 07 мая 2009

Я использовал nekoHtml , чтобы сделать это. Он может удалить все теги, но он также может легко сохранить или удалить часть тегов.

5 голосов
/ 19 марта 2014

Я знаю, что этот вопрос довольно старый, но я тоже его искал, и кажется, что найти хорошее и простое решение в 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
      }
    }
3 голосов
/ 24 сентября 2014

С чисто итеративным подходом и без регулярных выражений:

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();
}
3 голосов
/ 23 августа 2012

Привет, я знаю, что эта ветка старая, но она все еще вышла на первое место в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...