Выделение короткой строки-аннотации из HTML статьи

Встречались, наверное, с этой задачей — когда из статьи надо вырезать небольшой (а чаще всего, известной длины) кусочек, чтобы сформировать «тизер» или аннотацию. Наиболее правильный подход — предусмотреть для каждого вида аннотации (если статья может быть представлена в разных видах аннотаций, отличающихся, к примеру, длинной) — аннотацию, составленную вручную. Работы для редактора, конечно, прибавится, но и текстовых повторов будет меньше и пользователям будет приятнее.

Но отвлечемся от идеального случая, т.к. на практике аннотацией обычно служит первый параграф статьи. Итак, постановка задачи.

Необходимо выделить из HTML текста фразу (из начала этого текста) «примерно» заданной длины, сохраняя (частично) форматирование статьи.

Я хочу получить функцию следующего вида:

где text — исходный html текст, len — примерная длина аннотации в симв. и tags — набор разрешенных html тегов.

Хотелось бы, чтобы фраза не обрывалась на полуслове, а была частью предложения или целым предложением. Рассмотрим пару случаев — один простой и второй посложнее, чтобы вам было из чего выбирать.

Аннотация не содержит частичного форматирования, заданного в статье

То есть в аннотацию не надо переносить HTML теги, следить за тем закрыты ли они и гораздо проще определить длину строки. Параметр tags в этом случае не нужен. Параметр wordBound будет переключать между вариантами концовки аннотации — false — для включения в аннотацию целых предложений, а — true — для получения более точной длины аннотации — вырезаем строку по границе слова.

Аннотация с частичным форматированием из статьи

Ссылки, эмфазис, жирный шрифт и т.п. — все это можно перенести из статьи в аннотацию. При этом нужно решить две задачи — аккуратно посчитать длину строки, не включая туда участки html тегов и правильно учитывая случаи встречающихся html-кодов символов вроде — «"». А вторая задача — правильно закрыть открытые теги, т.к. строка нужной длины может быть уже найдена, а теги включенные в строку оказались не сбалансированы.

Первую задачу я решаю «вручную» — составляю «автомат с памятью состояния». Вторая давно задача решена и её в готовом виде я возьму из исходного кода движка WordPress ;). Там есть функция балансировки тегов, которая как раз нам подходит — force_balance_tags.

Вот что получается:

Мало букафф? Читайте есчо !

Публикация в Twitter средствами API (размещение текста, ссылки, картинки)

Апрель 11, 2013 г.

Да, представьте себе, у этой "пижни" есть свой API! Раньше им пользоваться было намного проще, не было этих наворотов с OAuth. Не смотря на мое личное ...

Читать

Переводим строку в число с плавающей запятой в PHP

Май 7, 2018 г.

Скаляры для PHP все на одно лицо. Строки или числа, с плавающей запятой или без. PHP не заморачивается. Ему не нужны строгие рамки типов скаляра. Платить за эту вольность приходится довольно скоро. Начнем с того, что PHP знает два оператора сложения, ...

Читать

Переводим массив в XML на PHP

Июнь 18, 2018 г.

Итак, как перевести ассоциативный массив в XML? Воспользуемся "родным" для PHP классом SimpleXMLElement. В качестве основного контейнера используем тег <values/>, а  установить UTF-8 кодировку нам поможет небольшая хитрость. Инициализация ...

Читать

Функция для локализации изображения при экспорте статьи

Февраль 29, 2016 г.

За многолетнюю практику работы с Drupal, я накопил целую библиотеку вспомогательных функций. Функция, описываемая в этой статье, используется для копирования ...

Читать
 

Комментарии к «Выделение короткой строки-аннотации из HTML статьи»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: