вы можете взорвать строку в массив слов,
тогда проверяйте строчку каждого слова не> 30
как
$words = explode(" ", $string);
foreach($words as $k=>$word){
if(strlen($word) >= 30)
$words[$k] = substr($word,0,30) ;
}
после этого возвращать массив в одну строку
с
join(' ' ,$words);