Как обрезать строки HTML, чтобы удалить поврежденные недействительные фрагменты HTML?

0

В моем Java webapp я создаю сводный текст длинного HTML-текста. В процессе усечения фрагменты HTML в строке часто ломаются, создавая строку HTML с недопустимыми и разбитыми фрагментами. Подобно этому примеру HTML-строка:

Visit this link <img src="htt

Есть ли какая-либо библиотека Java, чтобы справиться с этим лучше, чтобы избежать таких сломанных фрагментов, как указано выше?

Или я могу позволить, чтобы это было включено в HTML-страницы и как-то справлялось с этим, используя код на стороне клиента?

  • 0
    Можете ли вы проверить, помогают ли вам библиотеки NekoHtml? nekohtml.sourceforge.net
  • 0
    спасибо проверим ..
Теги:
client

2 ответа

0

Я использовал owasp-java-html-sanitizer чтобы исправить эти сломанные фрагменты, чтобы создать безопасную разметку HTML с Java.

PolicyFactory html_sanitize_policy = Sanitizers.LINKS.and(Sanitizers.IMAGES);
String safeHTML = html_sanitize_policy.sanitize(htmlString);

Это казалось самым легким из всех решений, с которыми я столкнулся.

0

Поскольку браузеры, как правило, могут иметь дело с почти любым мусором, который вы загружаете в него (если это не XHTML...), если единственное, что действительно происходит с вводом (при условии, что оно является допустимым HTML любого типа), нарезается, то единственное, о чем вам нужно беспокоиться, это фактически избавиться от недействительных открывающих тегов; вы не сможете отличить разбитые "концы" тегов, поскольку они сами по себе не являются особенными. Я бы просто взял кусочек, который я сгенерировал, и разбираю его с самого конца; если я столкнулся с блуждающим "<", я бы избавился от всего после него. Аналогично, я бы отслеживал последний открытый тег - если следующий закрытие после того, как он не закрыл этот точный тег, скорее всего, закрывающий тег вышел, поэтому я бы его вставлял.

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

Лучшим способом было бы управлять стеком открытых/закрытых тегов и генерировать/удалять необходимые/сломанные/ненужные по мере их появления. Стек является правильным решением, так как HTML - теги musn't 'крест' [по спецификации, AFAIR это так из HTML 4], то есть <SPAN> <DIV> </SPAN> </DIV> не является действительным.

Лучше всего было бы объединить документ после того, как он сначала проанализировал его как SGML/HTML/XML (в зависимости от точного HTML-типа) - тогда вы могли бы просто удалить узлы, не повредив структуру.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню