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

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

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

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

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

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

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

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

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

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

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

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

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

Написать комментарий

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

Считаем полное число строк в запросе MySQL, ограниченного LIMIT

Ноябрь 2, 2012 г.

О полезном операторе - SQL_CALC_FOUND_ROWS. Это конструкция просто незаменима для организации постраничного вывода каких либо данных. Все время забываю синтаксис, приходится каждый раз искать. Решил записать в блоге, чтобы уж не терять :). Во всех ...

Читать

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

Июнь 18, 2018 г.

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

Читать

 

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

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



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