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.