Как сокращать HTML с Java? - PullRequest
       60

Как сокращать HTML с Java?

20 голосов
/ 08 октября 2011

Пользователь вводит текст в виде 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) ?

Ответы [ 4 ]

6 голосов
/ 08 октября 2011

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

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

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

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

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

3 голосов
/ 08 октября 2011

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

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

Затем вы должны пройти через введенную строку и сосчитать «нормальные символы». Идя вдоль строки и считая, вы копируете каждый токен на выход, пока подсчитанные нормальные символы меньше или равны сумме, которую вы хотите получить.

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

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

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

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

1 голос
/ 10 ноября 2011

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

0 голосов
/ 03 января 2013

Похоже, что есть много библиотек и инструментов для этой общей задачи:

...