Я придумал эту функцию, которая усекает заданную строку либо заданному числу слов, либо заданному числу символов, что короче. Затем, после того, как он отрубает все после ограничения количества символов или слов, он добавляет «…» в строку.
Как удалить символы / слова из середины строки и заменить их на «…» вместо замены символов / слов в конце «…»?
Вот мой код:
function truncate($input, $maxWords, $maxChars){ $words = preg_split('/\s+/', $input); $words = array_slice($words, 0, $maxWords); $words = array_reverse($words); $chars = 0; $truncated = array(); while(count($words) > 0) { $fragment = trim(array_pop($words)); $chars += strlen($fragment); if($chars > $maxChars){ if(!$truncated){ $truncated[]=substr($fragment, 0, $maxChars - $chars); } break; } $truncated[] = $fragment; } $result = implode($truncated, ' '); return $result . ($input == $result ? '' : '...'); }
Например, если truncate('the quick brown fox jumps over the lazy dog', 8, 16);
, 16 символов короче, так что это усечение, которое произойдет. Таким образом, «лиса перепрыгивает через ленивую собаку» будет удалена, и «…» будет добавлен.
Но вместо этого, как я могу получить половину лимита символов от начала строки, а половина – от конца строки, а то, что удалено в середине, заменено на «…»? Итак, строка, которую я хочу вернуть, в этом случае, один случай будет: «quic … lazy dog».
$text = 'the quick brown fox jumps over the lazy dog'; $textLength = strlen($text); $maxChars = 16; $result = substr_replace($text, '...', $maxChars/2, $textLength-$maxChars);
$ result теперь:
the quic...lazy dog
Это не изменит входной сигнал, который меньше, чем $maxChars
, и учитывает длину замены ...
:
function str_truncate_middle($text, $maxChars = 25, $filler = '...') { $length = strlen($text); $fillerLength = strlen($filler); return ($length > $maxChars) ? substr_replace($text, $filler, ($maxChars - $fillerLength) / 2, $length - $maxChars + $fillerLength) : $text; }
Вот что я в итоге использовал:
/** * Removes characters from the middle of the string to ensure it is no more * than $maxLength characters long. * * Removed characters are replaced with "..." * * This method will give priority to the right-hand side of the string when * data is truncated. * * @param $string * @param $maxLength * @return string */ function truncateMiddle($string, $maxLength) { // Early exit if no truncation necessary if (strlen($string) <= $maxLength) return $string; $numRightChars = ceil($maxLength / 2); $numLeftChars = floor($maxLength / 2) - 3; // to accommodate the "..." return sprintf("%s...%s", substr($string, 0, $numLeftChars), substr($string, 0 - $numRightChars)); }
Для моего варианта использования правая часть строки содержит более полезную информацию, поэтому этот метод смещен, чтобы вывести символы из левой половины.