Довольно часто встречаемая задача: обрезать строку до определенного количества символов, и в тот же момент не оставляя в конце обрывки слов. Способов существует великое множество, и все это делают по своему, но я все же предложу свой способ.
Это немного усложненный вариант обрезки строки, общие моменты по обрезке строки перечислены в заметке:
Я реализовал это в виде небольшой функции:
1 2 3 4 5 6 7 8 9 10 | function crop_str($string, $limit, $after = '') { if (strlen($string) > $limit) { $substring_limited = substr($string, 0, $limit); //режем строку от 0 до limit $return = substr($substring_limited, 0, strrpos($substring_limited, ' ')) . $after; } else $return = $string; return $return; } |
В принципе все расписано в комментариях, но все же опишу процесс, если кому-то вдруг будет непонятно
У функции два параметра: строка, которую режем и длина обрезанного текста.
Сначала обрезаем строку до установленного количества символов, а потом эту же подстроку обрезаем до последнего пробела.
Пример:
1 2 3 4 5 6 | $string = '43 43 43 43 43 43 43 43 43 43 43 4343 443 434343 43 43 vv 43 43 43 43 43 43 43 4343 43'; $limit = 43; $new_string = crop_str($string, $limit); echo 'Limit: ' . $limit . '<br/> String: ' . str_replace($new_string, '<strong>' . $new_string . '</strong>', $string) .'<br/>Strlen: ' . strlen($string); echo '<br/>Substring: ' . $new_string . '<br/>Strlen: ' . strlen($new_string); |
Результат:
Limit: 43
String: 43 43 43 43 43 43 43 43 43 43 43 4343 443 434343 43 43 vv 43 43 43 43 43 43 43 4343 43
Strlen: 87
Substring: 43 43 43 43 43 43 43 43 43 43 43 4343 443
Strlen: 41
Кстати, в качестве дополнения функционала можнл сделать условие, что-бы функция не применялась если в строке меньше символов чем задано
function crop_str($string, $limit)
{
if (strlen($string) >= $limit ) {
$substring_limited = substr($string,0, $limit);
return substr($substring_limited, 0, strrpos($substring_limited, ‘ ‘ ));
} else {
//Если количество символов строки меньше чем задано, то просто возращаем оригинал
return $string;
}
}
Да, в принципе уже и сделал, тут только обновить забыл =)
Спасибо. Иногда простые вещи быстро забываются. К функции можно добавить многоточие после обрезки, чтобы смысл обрезки был понятен.
Вообще-то функция берет не последний пробел в уже обрезанной строке, а первый встречный! Как исправить?
Александр, как Вы ее вызываете?
return substr($substring_limited, 0, strrpos($substring_limited, ‘ ‘)); — вот так и вызываю,
strrpos($substring_limited, ‘ ‘)) — берет первый попавшийся пробел, разве не так?
вот мое решение
$string = substr($string, 0, strripos(substr($string,0,$limit),’ ‘));
Да еще можно улучшить, чтобы в конце не оставались знаки препинания в виде запятых, точек и прочего.
«Если строка обрежется, скажем,…»