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

Как аббревиатура Html с Java?

Пользователь вводит текст в виде HTML в форме, например:

<p>this is my <strong>blog</strong> post, 
very <i>long</i> and written in <b>HTML</b></p>

Я хочу иметь возможность вывести только часть строки (например, 20 первых символов), не нарушая структуру HTML пользовательского ввода. В этом случае:

<p>this is my <strong>blog</strong> post, very <i>l</i>...</p>

который отображается как

это мой блог, очень lo...

Есть ли библиотека Java, способная это сделать, или простой метод для использования?

MyLibrary.abbreviateHTML(string,20) ?
4b9b3361

Ответ 1

Так как это не очень просто сделать это правильно, я обычно разделяю все теги и усекаю. Это дает большой контроль над размером и внешним видом текста, который обычно необходимо размещать в местах, где вам нужен контроль.

Обратите внимание, что вы можете найти мое предложение очень консервативным, и на самом деле это не правильный ответ на ваш вопрос. Но в большинстве случаев альтернативы:

  • разделите все теги и обрезайте
  • предоставляет альтернативный контент, управляемый богатым текстом, который будет служить усеченным текстом. Это, конечно, работает только в случае CMS и т.д.

Причина, по которой усечение HTML будет сложной, заключается в том, что вы не знаете, как усечение повлияет на структуру HTML. Как бы вы обрезали середину <ul> или, что еще хуже, в середине сложного <table>?

Итак, проблема заключается в том, что HTML может содержать не только контент и стиль (жирный, курсив), но и структуру (списки, таблицы, div и т.д.). Таким образом, хорошая и безопасная реализация заключалась бы в том, чтобы вырезать все отдельно от встроенных тегов "styling" (жирный шрифт, курсив и т.д.) И усекать, сохраняя следы закрытых тегов.

Ответ 2

Я не знаю никакой библиотеки, но она не должна быть такой сложной (на 80%). Вам нужен только простой "парсер", который понимает 4 типа токенов:

  • открывающие теги - все, что начинается с <, но не </ и заканчивается на >, но не />
  • закрывающие теги - все, что начинается с </ и заканчивается на >
  • самозакрывающиеся теги (например, <br/>) - все, что начинается с <, но не </ и заканчивается на />, но не >
  • нормальный символ - все, что не относится к другим типам

Затем вы должны пройти через строку ввода и подсчитать "нормальные символы". Пока вы идете по строке и подсчитываете, вы копируете каждый маркер на выходе, если подсчитанные нормальные символы меньше или равны количеству, которое вы хотите иметь.

Вам также нужно создать стек текущих открытых тегов, в то время как вы идете по идее ввода. Каждый раз, когда вы проходите через "открывающий тег", вы помещаете его в стек (его имя), каждый раз, когда вы обнаруживаете закрывающий тег, вы удаляете самое верхнее имя тега из стека (надеюсь, что вход правильный XHTML).

Когда вы достигнете конца требуемого количества обычных символов, вам нужно только написать закрывающие теги HTML для имен тегов, оставшихся в стеке.

Но будьте осторожны, это работает только с вводом - это правильно сформированный XML.

Я не знаю, что вы хотите сделать с этим фрагментом кода, но вы должны обратить внимание на атаки на HTML/JavaScript.

Ответ 3

Если вы действительно хотите сокращать HTML, просто сделайте это (вырежьте текст по желаемой длине), передайте сокращенный результат через http://jtidy.sourceforge.net/ и надеемся на лучшее.