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

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

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

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

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

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

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

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

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

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

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

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

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

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

Получить номер текущей строки в PHP

Август 27, 2020 г.

Для логгирования иногда важно не только записать какое то сообщение, но также указать - где именно произошло событие в скрипте. Давайте посмотрим, как можно получить номер строки и имя файла в PHP. Данная информация может быть предоставлена php ...

Читать

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

Июнь 18, 2018 г.

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

Читать

Загрузка-выгрузка в формате excel из PHP

Август 25, 2017 г.

Встроенные библиотеки PHP не позволяют работать с форматами данных популярного табличного процессора Excel. За исключением текстового формата CSV (см. ...

Читать

Как произвести в PHP HTTP авторизацию в запросе через curl

Сентябрь 17, 2020 г.

Пример кода, выполняющий HTTP авторизацию при запросе через curl. Этот тип авторизации также известен как BASIC. Для формирования правильных заголовков запроса вам потребуется правильно установить две опции curl: CURLOPT_HTTPAUTH и CURLOPT_USERPWD. ...

Читать
 

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

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



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