Как бы вы программно сократили XHTML до произвольного количества слов, не оставляя незакрытых или поврежденных тегов?
т.е.
<p>
Proin tristique dapibus neque. Nam eget purus sit amet leo
tincidunt accumsan.
</p>
<p>
Proin semper, orci at mattis blandit, augue justo blandit nulla.
<span>Quisque ante congue justo</span>, ultrices aliquet, mattis eget,
hendrerit, <em>justo</em>.
</p>
Сокращенно до 25 слов будет:
<p>
Proin tristique dapibus neque. Nam eget purus sit amet leo
tincidunt accumsan.
</p>
<p>
Proin semper, orci at mattis blandit, augue justo blandit nulla.
<span>Quisque ante congue...</span>
</p>






Выполните рекурсию по дереву DOM, постоянно обновляя переменную количества слов. Когда количество слов превышает максимальное количество слов, вставьте «...» и удалите всех следующих братьев и сестер текущего узла, а затем, возвращаясь вверх по рекурсии, удалите всех следующих братьев и сестер каждого из его предков.
Вы должны думать о XHTML как об иерархии элементов и относиться к ней как к таковой. Это в основном способ обработки XML. Затем просто рекурсивно просмотрите иерархию, добавляя количество слов вместе по ходу. Когда вы достигнете своего предела, выбросьте все остальное.
Я работаю в основном на PHP, и я бы использовал класс DOMDocument в PHP, чтобы помочь мне в этом, вам нужно найти что-то подобное на выбранном вами языке.
Чтобы было понятнее, вот иерархия для вашего образца:
- p
- Proin tristique dapibus neque. Nam eget purus sit amet leo
tincidunt accumsan.
- p
- Proin semper, orci at mattis blandit, augue justo blandit nulla.
- span
- Quisque ante congue justo
- , ultrices aliquet, mattis eget, hendrerit,
- em
- justo
- .
Вы достигли ограничения в 25 слов внутри элемента span, поэтому вы удалили весь оставшийся текст в диапазоне и добавили многоточие. Все остальные дочерние элементы (как текст, так и теги) могут быть отброшены, а все последующие элементы могут быть отброшены.
Насколько я понимаю, это всегда должно оставлять вам действительную разметку, поскольку вы рассматриваете ее как иерархию, а не просто текст, все закрывающие теги, которые требуются, все равно будут там.
Конечно, если XHTML, с которым вы имеете дело, изначально недействителен, не ожидайте, что вывод будет действительным.
Извините за пример плохой иерархии, не могу понять, как вкладывать списки.