Я пытаюсь обрезать длинную строку до определенного количества символов и интерполировать другую определенную пользователем строку посередине (более или менее), чтобы представить, что строка была усечена. И в то же время я пытаюсь заставить слова не сломаться пополам. Например:Обрезать длинные строки, без разрыва слова с интерполяцией точек
Быстрая коричневая лиса перепрыгнула через ленивую собаку
Если определено (в качестве параметра функции) укоротить эту строку до 20 символов результирующая строка должна быть что-то вроде:
Быстрый коричневая ... ленивая собака
ближайшая реализацией я пришел была:
function truncate($string, $length, $append = NULL) {
if(strlen($string) <= $length) return $string;
$append = (strlen($append) ? sprintf(' %s ', $append) : ' ... ');
$start = round($length/2);
$start = strlen(substr($string, 0, (strpos(substr($string, $start), ' ') + $start)));
$end = ($start - strlen($append));
$end = strlen(substr($string, 0, strrpos(substr($string, $start + strlen($append) - 1), ' ')));
return substr($string, 0, $start) . $append . substr($string, (strlen($string) - $end));
}
Но не только это не работает гладко с строками разной длины, но также не усекает размер, как определено.
Для некоторых строк я получаю дублируюсь пустые символы (из-за неправильную математику о пустых пространствах, используемых Sprintf() более $ Append), иногда одна буквы удаляется от слова ближайшего к интерполируемой строке, а иногда слово становится разбитым пополам, когда это не должно.
выше строка, например, если он используется как:
truncate($str, 20);
Результаты в:
шустрая ... PED через ленивую собаку
Куда подходит длина 20? Вывод строки строки на самом деле равен 32, поэтому в 20 это будет «Быстрая ... ленивая собака»? –