Prova ad usare questa:
codice:
$len = 30;
preg_match_all("/.{{$len},}?[?!.]+/s",$testo,$mth);
print_r($mth[0]);
Dovrebbe avere il solo inconveniente che se hai delle abbreviazioni o degli acronimi non li riconosce.
In alternativa ho provato ad aggiungere dei controlli
codice:
$len = 30;
$skipwords='es|avv|dott';
preg_match_all("/.{{$len},}?(?:[?!]|(?<!$skipwords|\b\w)\.)+/si",$testo,$mth);
print_r($mth[0]);
Ma che alla fine ovviamente ha i suoi limiti in quanto una frase può chiudersi con una abbreviazione "etc." invece di "etc.." oppure "c.i.a." invece di "c.i.a.." che non vengono riconosciuti come fine di una frase.