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.