Если нужно образать строку в php красиво и грамотно, есть стандартная функция substr. Но есть ряд проблем, которые возникают при ее использовании. Вот их список:
- Она не работает с русскими символами.
- Обрезает строку скажем «где попало». А нужно в идеале по целым словам.
Эти проблемы быстро решаются. Т.к. я работаю в последнее время с YiiFramework, то и решение хотелось бы оформить в его стиле. В таком случае логично создать getter, который будет на выходе нам отдавать уже готовую строку, обрезаную по словам средстами php.
Итак есть у нас getter:
public function getShortText() { return $text; }
Допустим у нас есть свойство в этой модели($this->text), которое содержит полный текст, который нам нужно обрезать. В моем случае это был полный текст материала в добавок с html тэгами. В таком случае у нас появилась еще одна маленькая проблема — нужно удалить все тэги со строки. Для этого нужно прописать следующую строку:
$text=strip_tags($this->text);
Дальше воспользуемся функцией mb_substr — это аналог substr, только можно указывать кодировку символов передаваемой строки.
$pos = mb_strpos($text, ‘ ‘, 155, ‘UTF-8′); // здесь мы определяем позиции последнего пробела в уже обрезанной строке и позицию с которой нужно начинать поиск. $text = mb_substr($text, 0, $pos, ‘UTF-8′); // и обрезаем переменную строки до этой позиции, не забываем в кажой функции указывать нужную кодировку, в моем случае UTF-8
Вот и все, нам осталось вернуть с этого метода обработанную строку. В моем случае понадобилось еще добавить троеточие в конце. Также я добавил проверку начальной длины нашей строки, т.к. если она уже меньше нужной нам длины, то обрезать не нужно. В конечном итоге наш getter будет выглядеть так:
public function getShortText(){ $text=strip_tags($this->text); if(mb_strlen($text, 'UTF-8')>155) { $pos = mb_strpos($text, ‘ ‘, 155, ‘UTF-8′); $text = mb_substr($text, 0, $pos, ‘UTF-8′); return $text.'...'; } else return $text; }
По сути все. Пользуемся кому нужно.
Спасибо за помощь и подсказки - Veaceslav Medvedev.
«`
[php]
$pos = mb_strrpos($string, ‘ ‘, 155, ‘UTF-8′);
$string = mb_substr($string, 0, $pos, ‘UTF-8′);
return $string.’…’;
«`
Что не так?
можно убрать mb_substr
плюс третий параметр в mb_strrpos идет $offset а не $charset, по документации, я эти функции не юзаю, и никому не советую.
Обычные strrpos прекрасно со всем справляются, если php настроен правильно, а именно к этому нужно стремится.
Спасибо, принял во внимание и исправил эти моменты в статье.