пятница, 6 декабря 2013 г.

Как в PHP обрезать строку до целого слова?

  Читая Яндекс.Новости, я задался вопросом: а почему на своих сайтах я обрезаю тексты до указанного символа, часто оставляя в конце нечитаемый набор букв? Красивее же смотрелось бы, если бы строка обрезалась до целого слова. И толи по сложившейся привычке, толи из интереса я таки решил докопаться до решения, которое наверняка понравится посетителям.

  Как мы распознаём слова в предложении? Они отделяются пробелами. Следовательно, нужно найти в тексте позицию «нужного» пробела и обрезать всё, что находится за ним. Подумаем, как это можно сделать.

  В PHP есть функция strpos, позволяющая найти позицию первого вхождения в строку нужного нам символа. Она же позволяет сделать отступ, чтобы искать не с начала строки, а допустим, с 140 символа. Значит, выяснить, где находится нужный пробел проблемой не будет.
$str = 'Сдам в аренду хорошую однокомнатную квартиру в районе Петроградской площади. Мебель на кухне, в коридоре, комнате, есть холодильник, кухонная плита, телевизор, микроволновая печь. Сдаётся на длительный срок семье или семейной паре. Отдельно оплачиваются коммунальные услуги.'; //исходный текст
$key = strpos($str, ' ', 140); //получаем позицию ближайшего пробела, начав поиск с 140 по счёту символа
  Затем используем функцию substr, которая позволяет обрезать строку до нужной нам длины. Первым параметром задаём переменную, в которой содержится текст; вторым параметром идёт позиция, с которой начинаем отсчёт; третий параметр - позиция, до которой обрезаем наш текст.
echo substr($str, 0, $key);
  Как оказалось, всё просто. Соединим весь получившийся код, сократим его и добавим в конец обрезанного текста многоточие, чтобы пользователи понимали, что выведен не весь имеющийся в базе текст, а лишь его часть.
$str = 'Сдам в аренду хорошую однокомнатную квартиру в районе Петроградской площади. Мебель на кухне, в коридоре, комнате, есть холодильник, кухонная плита, телевизор, микроволновая печь. Сдаётся на длительный срок семье или семейной паре. Отдельно оплачиваются коммунальные услуги.';
echo substr($str, 0, strpos($str, ' ', 140)).'...';
  В результате мы получили текст, обрезанный до целого слова. Для моего примера это строка следующего содержания:
Сдам в аренду хорошую однокомнатную квартиру в районе Петроградской площади....
  В моём тексте позиция «нужного» пробела совпала с началом нового предложения, поэтому получилось четыре точки вместо трёх. Чтобы обрезать лишние символы (среди них могут также быть запятая, восклицательный знак и другие знаки препинания), можно воспользоваться регулярными выражениями.

2 комментария:

  1. Проблема будет если длина строки будет меньше, заданных вами 140 символов.

    ОтветитьУдалить
  2. Функция вернула меньше 140 символов. Функции mb_internal_encoding() и mb_substr() в помощь.

    ОтветитьУдалить