truncar cadena, pero eliminar la mitad de la cadena en lugar de final

Se me ocurrió esta función que trunca una cadena dada al número de palabras dado o al número de caracteres que sea más corto. Luego, después de cortar todo después del límite de número de caracteres o palabras, agrega un '...' a la cadena.

¿Cómo puedo eliminar caracteres / palabras de la mitad de la cadena y reemplazarlos con '...' en lugar de reemplazar caracteres / palabras al final con '...'?

Aquí está mi código:

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 ? '' : '...');
}

Por ejemplo sitruncate('the quick brown fox jumps over the lazy dog', 8, 16); se llama, 16 caracteres es más corto, de modo que es el truncamiento que sucederá. Por lo tanto, se eliminará 'fox salta sobre el perro perezoso' y se añadirá '...'.

Pero, en cambio, ¿cómo puedo tener la mitad del límite de caracteres desde el principio de la cadena y la mitad desde el final de la cadena y lo que se elimina en el medio reemplazado por '...'? Entonces, la cadena que estoy buscando que se devuelva en este caso, uno, sería: "el quic ... perezoso perro".

Respuestas a la pregunta(3)

Su respuesta a la pregunta