В моем Java webapp я создаю сводный текст длинного HTML-текста. В процессе усечения фрагменты HTML в строке часто ломаются, создавая строку HTML с недопустимыми и разбитыми фрагментами. Подобно этому примеру HTML-строка:
Visit this link <img src="htt
Есть ли какая-либо библиотека Java, чтобы справиться с этим лучше, чтобы избежать таких сломанных фрагментов, как указано выше?
Или я могу позволить, чтобы это было включено в HTML-страницы и как-то справлялось с этим, используя код на стороне клиента?
Я использовал owasp-java-html-sanitizer
чтобы исправить эти сломанные фрагменты, чтобы создать безопасную разметку HTML с Java.
PolicyFactory html_sanitize_policy = Sanitizers.LINKS.and(Sanitizers.IMAGES); String safeHTML = html_sanitize_policy.sanitize(htmlString);
Это казалось самым легким из всех решений, с которыми я столкнулся.
Поскольку браузеры, как правило, могут иметь дело с почти любым мусором, который вы загружаете в него (если это не XHTML...), если единственное, что действительно происходит с вводом (при условии, что оно является допустимым HTML любого типа), нарезается, то единственное, о чем вам нужно беспокоиться, это фактически избавиться от недействительных открывающих тегов; вы не сможете отличить разбитые "концы" тегов, поскольку они сами по себе не являются особенными. Я бы просто взял кусочек, который я сгенерировал, и разбираю его с самого конца; если я столкнулся с блуждающим "<", я бы избавился от всего после него. Аналогично, я бы отслеживал последний открытый тег - если следующий закрытие после того, как он не закрыл этот точный тег, скорее всего, закрывающий тег вышел, поэтому я бы его вставлял.
Это все равно создало бы много мусора, но, по крайней мере, исправить некоторые рудиментарные проблемы.
Лучшим способом было бы управлять стеком открытых/закрытых тегов и генерировать/удалять необходимые/сломанные/ненужные по мере их появления. Стек является правильным решением, так как HTML - теги musn't 'крест' [по спецификации, AFAIR это так из HTML 4], то есть <SPAN> <DIV> </SPAN> </DIV> не является действительным.
Лучше всего было бы объединить документ после того, как он сначала проанализировал его как SGML/HTML/XML (в зависимости от точного HTML-типа) - тогда вы могли бы просто удалить узлы, не повредив структуру.
Обратите внимание: вы не можете знать, правильно ли тег, не предоставляя точный алгоритм, который вы используете для создания этого "искаженного" контента.