Esta pregunta la acabo de contestar en otro foro así que copio la respuesta que puse allí...
Mi solución es usar expresiones regulares. La expresión que tengo en mente es esta:
Código :
\b\w{15,}
Dice: encontrar palabras que tengan al menos 15 caracteres. No importa si la palabra tiene caracteres repetidos porque el objetivo es que una palabra muy larga no "rompa" el límite de espacio en la página ¿cierto?, entonces cualquier palabra larga podría arruinar el formato (si es que entendí bien el problema, claro).
Implementación:
Código :
<?php
$patron = "/\b\w{15,}/";
$hits = Array();
$c = preg_match_all($patron, $cadena, $hits);
var_dump($hits);
?>
En $c tienes la cantidad de palabras que cumplen la condición y en el array $hits tienes las palabras que cumplen la expresión regular, las que luego puedes reemplazar para acortarlas así:
Código :
if ($c > 0) {
for ($i=0;$i<$c; $i++) {
$h = $hits[0][$i];
$p1 = substr($h,0,14);
$p2 = substr($h,15,strlen($h));
$salida = $p1."<br>".$p2;
echo $salida; // 1
}
}
Notar que el código anterior solo corta las palabras en la posición 15, si la palabra es más larga que 30, habrá que repetir el proceso (esto se puede hacer recursivamente pero no lo haré aquí). Notar también que lo que hago es inserar un tag br en la posición 15 de la palabra pero puede ser reemplazado por un espacio y luego confiar en la función wordwrap() para que formatee mejor el texto. Esto es a gusto del consumidor

.
Finalmente hay que reemplazar los resultados en el texto original. En el código anterior, reemplazar la línea marcada con // 1 por:
Código :
$cadena = str_replace($h,$salida,$cadena);
Listo

.