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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Валидатор ip адреса на PHP

Ноябрь 13, 2015 г.

Пример хелпера-валидатора на PHP для проверки формата ip адреса. [crayon-5a8aad925dfb2483726191/] Функция проверяет является ли формально строка ip-адресом по протоколам ipv4 или ipv6. Возвращает булево значение. Возможно применение этого кода ...

Читать

Регистрация/авторизация в Drupal по учетке в соц.сетях

Май 12, 2013 г.

Самое не приятное, с чем можно встретиться на многих сайтах - это регистрация учетной записи. Неприятное ощущение усиливается ещё и от контраста - везде ...

Читать

 

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

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



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