Wpadłem na tę funkcję, która obcina dany ciąg do podanej liczby słów lub podanej liczby znaków, co jest krótsze. Następnie, po odłożeniu wszystkiego po liczbie znaków lub limicie słów, dodaje łańcuch "...".przyciąć ciąg, ale usunąć środkową część ciągu zamiast końca
Jak usunąć znaki/słowa ze środka ciągu i zastąpić je "..." zamiast zastępowania znaków/słów na końcu "..."?
Oto mój kod:
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 ? '' : '...');
}
Na przykład jeśli truncate('the quick brown fox jumps over the lazy dog', 8, 16);
nazywa, 16 znaków jest krótszy, dzięki czemu jest obcięcie że nastąpi. Tak więc "lis przeskoczy leniwego psa" zostanie usunięty i "..." zostanie dołączony.
Ale zamiast tego, w jaki sposób uzyskać połowę limitu znaków, może pochodzić od początku łańcucha, a połowa od końca łańcucha, a to, co zostało usunięte w środku, zastąpione przez "..."? Tak więc, ciąg znaków, który chciałbym zwrócić w tym jednym przypadku: "szybki ... leniwy pies".
+1 proste i piękne. – Orangepill
Wymaga 'if ($ textLength> $ maxChars)' – Petah
Zwróć uwagę, że w wyniku tego łańcuch składa się z 19 znaków, mimo że $ maxChars ma wartość 16. – adean