Обрезка текста: как сделать сниппет
- Зачем нужны эти вырезки текста или сниппеты
- А почему «автоматические»? Я сам могу!
- Решаем, из чего формировать сниппет
- Почистим текст, если нужно
- Откусим кусок нужной длины
Сразу скажу, исходников готового решения тут не будет, отчасти потому что я вредина, отчасти потому, чтобы формат статьи был максимально «мультиязычный», подходил ко многим языкам программирования.
Рассмотрим более общие вопросы: во-первых, зачем это сделать, во-вторых, как сделать. То есть — что должно быть в механизме автоматического создания этакой «превьюшки» текста. Или, по-модному, сниппета (snippet).
Зачем нужны эти вырезки текста или сниппеты
Нужны они прежде всего для того, чтобы бегающий глазками по вашей странице ленивый посетитель мог прикинуть для себя примерное содержание того, что «под катом», то есть — полной версии статьи. Параллельно, мозг читателя проводит параллель между заголовком и, получается, аннотацией к материалу. В результате чего на выходе черного ящика белого черепа имеем целесообразность клика по ссылке на статью.
Можно выделить основные моменты, которые следует учитывать:
-
Наличие сниппета.
Уже то, что этот краткий текст есть, заставляет посетителя обольщаться, будто о нём, сердешном, заботятся, чтобы он, весь такой спешащий и занятой, не совершал лишних мысле- и телодвижений. -
Соответствие сниппета заголовку статьи.
Это убеждает читателя в толковости статьи, толковости автора и повышает ценность материала. Не зайдет сейчас, так будет помнить, что «где-то там видел это» и побежит искать, когда понадобится. -
Информативность сниппета.
Желательно, чтобы снизошедший до прочтения этого обрывка пользователь сходу поимел (в приличном смысле) представление о содержимом и стиле изложения. Конечно, он может и уйти, если заявленная тема ему не нужна, но если нужна, то он будет щелкать на «читать далее» с гораздо более позитивными эмоциями, вроде: «Ура! Нашел! Для реферата на завтра сойдет!». Главное — не разочаровать его потом, но это уже другая задача.
А почему «автоматические»? Я сам могу!
Ну да, конечно. Замучаетесь. Если выдавать один текст в неделю, от души, то ладно — справитесь. Иначе — никак. Особенно если по работе надо выдавливать из себя тексты на разную тематику (копирайтинг, SEO). После паручасового потения серым веществом и облегчённого вздоха «ух, готово», запоздалая мысль о сниппете-превьюшке способна ввести в ужас изрядно подвисшие нейроны. особенно с учётом того, что текст этот должен быть определённой длины, иначе статья будет выбиваться из общего списка. А иногда и вёрстка может поехать. Это особенно актуально для сайтов, на которые пишут множество авторов.
Решаем, из чего формировать сниппет
Обычно берут и программно отрезают нужный кусок текста с самого начала, навесив вдогонку к нему многозначительное многоточие™. Это прекрасно работает, пока сферические идеальные для веба авторы пишут идеальные тексты в вакууме идеальной тематики.
В реальной жизни в начале текста может оказаться что угодно, от списка запчастей, просто не особо привлекательных фраз, до стихотворного эпиграфа, который, конечно, хорош, возвышен и смешон, но… без отрыва от основного текста. А основной текст в сниппет может и не попасть из-за ограничения длины в символах заради сохранения приятной глазу армейской стройности рядов статей на странице категории.
Выход есть. Не так давно Яндекс ввел новую нотацию своего тега <noindex> в виде HTML-комментария:
<p> Это предложение читается роботом Яндекса. <!--noindex--> А этот текст отбрасывается роботом.<!--/noindex--> И далее всё опять читается в штатном режиме. </p>
Я подумал, чего изобретать велосипед, и ввёл себе свой подобный «тэг»:
<p> Эта часть попадает в сниппет. <!--nosnippet--> А этот текст не берётся в сниппет.<!--/nosnippet-->; И далее всё опять попадает в аннотацию </p>
Например, при работе именно с языком PHP, вырезку ненужных кусков (делать в первую очередь, первым шагом алгоритма) производит preg_replace с простым регулярным выражением.
Теперь «попадаемость» текста в сниппет можно регулировать. Согласитесь, разъяснить пишущей братии, как им обрамлять нежелательные куски, гораздо легче, чем заставить их всех (и себя в том числе) писать первый абзац текста по определенным критериям, без пространных вступлений, мелкого буквенного хулиганства или еще чего. А на самой странице статьи эти HTML-комментарии останутся именно комментариями и не будут заметны.
В этой статье таким способом я из сниппета выкинул первый поясняющий абзац, который мог бы обидеть и напугать посетителя, смотрите код страницы. Заходи — не бойся, выходи — не плачь, так сказать.
Стоит предупредить, что может произойти еще кое-какая веселуха. На вашу страницу может забрести какой недалёкий начинающий оптимизатор сайтов, глянуть код и испугаться, что жизнь проходит мимо него. Он может подумать, что уже кто-то управляет сниппетами поисковых систем и впасть в панику, когда это он такое пропустил.
Почистим текст, если нужно
Перед «обрезанием», кроме мановением руки назначенных нежелательными фрагментов, надо повыкидывать все остальное ненужное. В случае веба — это, обычно, HTML-теги, BBCode или какое-то еще форматирование. Нам нужен «чистый» текст, так как требуется уложиться в заданные размеры сниппета.
//Нафиг HTML! $preparedText = strip_tags($articleText);
Знаки препинания убивать не надо! Сниппет должен быть грамотным.
Откусим кусок нужной длины
Первоочередной проблемой данного шага является недопущение обрезки куска слова. Дабы избежать ситуаций, когда сниппет закончится фразой вроде «и потом я пошел на ху…». Это, конечно, может, в некоторой степени, мотивировать читателя посмотреть полный текст статьи. Но он будет жёстко разочарован тем, что горе-программист, у которого слова режутся в сниппете пошёл на «художественный фильм», а не туда, куда ему, собственно, и надо идти.
Я делаю так:
-
Разбивка на слова.
Разбиваю текст на отдельные слова по пробельным символам. Получаю массив слов. Во многих языках это дело решается вызовом пары-тройки функций, а то и одной-единственной. -
Собираем строку сниппета.
В цикле «складываю» слова в строковую переменную через пробел, пока не приближусь вплотную к ограничению длины. Пока не станет ясно, что добавление следующих двух слов превысит этот предел. То есть, если у меня уже есть 190 символов при лимите в 200, а следующие слова у меня «вот» (3 символа + 1 пробел) и «начали» (6+1), то уже хватит. -
Завершающая шлифовка окончания сниппета.
Почему останавливаюсь за два слова, а не за одно? Потому что в конце последнего добавляемого слова могут быть точки (попали на конец предложения), запятые и другие знаки препинания. Ведь раньше мы их не трогали? Далее — как хотите, зависит от особенностей реализации. Если вы приписываете многоточия всем сниппетам автоматически при выводе — уберите знаки препинания из последнего слова. Сниппет, оканчивающийся на запятую, после которой идет многоточие выглядит по-идиотски и однозначно характеризует автора программного обеспечения. Если многоточие входит (а может и не входить) в сниппет — оставляйте точку, где она попалась, а где нет точки — заменяете завершающий слово знак препинания многоточием.
Ну и сохраняете. Сниппет готов, приятен глазу и работает с высоким КПД.
28.07.2010 | 23:36
