Лучшим решением, которое я нашел, было использование cyberneko для анализа вашей строки и некоторой "умной" обработки событий SAX.
cyberneko проанализирует ваш HTML, даже если он недействителен,это имеет место для подавляющего большинства HTML, с которым вы, вероятно, столкнетесь в дикой природе.
Если вы зарегистрируете пользовательский ContentHandler
, который по существу игнорирует все, кроме событий character
, и просто добавляете их кпостроитель строк, вы получите хорошее первое приближение с досадным недостатком: слова, разделенные блочным элементом, будут конкатенированы (for<br/>example
=> forexample
).
Лучшее решение -получить список всех элементов блока и прослушать ContentHandler
события startElement
.Если элемент является блочным, просто добавьте символ пробела к строителю строки.
Обратите внимание, что, хотя это, кажется, работает нормально, оно может не подойти для вашего варианта использования.Например, <br/>
не превращается в разрыв строки.Впрочем, добавить его, если это необходимо, не должно быть слишком много.