Fusionar dos expresiones regulares para truncar palabras en cadenas

Estoy tratando de encontrar la siguiente función que trunca la cadena a palabras completas (si es posible, de lo contrario, debería truncarse a caracteres):

function Text_Truncate($string, $limit, $more = '...')
{
    $string = trim(html_entity_decode($string, ENT_QUOTES, 'UTF-8'));

    if (strlen(utf8_decode($string)) > $limit)
    {
        $string = preg_replace('~^(.{1,' . intval($limit) . '})(?:\s.*|$)~su', '$1', $string);

        if (strlen(utf8_decode($string)) > $limit)
        {
            $string = preg_replace('~^(.{' . intval($limit) . '}).*~su', '$1', $string);
        }

        $string .= $more;
    }

    return trim(htmlentities($string, ENT_QUOTES, 'UTF-8', true));
}

Aquí hay algunas pruebas:

// Iñtërnâtiônàlizætiøn and then the quick brown fox... (49 + 3 chars)
echo dyd_Text_Truncate('Iñtërnâtiônàlizætiøn and then the quick brown fox jumped overly the lazy dog and one day the lazy dog humped the poor fox down until she died.', 50, '...');

// Iñtërnâtiônàlizætiøn_and_then_the_quick_brown_fox_...  (50 + 3 chars)
echo dyd_Text_Truncate('Iñtërnâtiônàlizætiøn_and_then_the_quick_brown_fox_jumped_overly_the_lazy_dog and one day the lazy dog humped the poor fox down until she died.', 50, '...');

Ambos funcionan como están, sin embargo, si dejo caer el segundopreg_replace() Me sale lo siguiente:

Iñtërnâtiônàlizætiøn_and_then_the_quick_brown_fox_jumped_overly_the_lazy_dog y un día el perro perezoso jorobó a la pobre zorra hasta que murió ...

No puedo usarsubstr() porque solo funciona a nivel de byte y no tengo acceso amb_substr() ATM, he hecho varios intentos para unir la segunda expresión regular con la primera pero sin éxito.

Ayude a S.M.S., he estado luchando con esto durante casi una hora.

EDITAR: Lo siento, he estado despierto durante 40 horas y descaradamente me perdí esto:

$string = preg_replace('~^(.{1,' . intval($limit) . '})(?:\s.*|$)?~su', '$1', $string);

Aún así, si alguien tiene una expresión regular más optimizada (o una que ignora el espacio final), comparta:

"Iñtërnâtiônàlizætiøn and then "
"Iñtërnâtiônàlizætiøn_and_then_"

EDIT 2: Todavía no puedo deshacerme del espacio en blanco final, ¿alguien puede ayudarme?

EDITAR 3: Bueno, ninguna de mis ediciones realmente funcionó, RegexBuddy me estaba engañando; probablemente debería dejar esto para otro día y dormir un poco ahora. Fuera por hoy.

Respuestas a la pregunta(2)

Su respuesta a la pregunta