Hi,
$neutext=preg_replace('~(^|\s)(\S{'.$len.'})(\S)~S', '\1\2 \3', $text);
Statt alles mit einem einzigen regular expression zu erledigen,
kannst Du natürlich Deinen Text Zeichen für Zeichen parsen und dann
beliebig komplizierte Verarbeitungslogiken umsetzen.
Wenn das nächste Zeichen _kein_ '&' ist, dann ist es eigenständig,
ansonsten leitet es eine Entität ein, die bis zum (hoffentlich vor-
handenen!) schließenden ';' reicht (oder bis vor den nächsten Nicht-
Buchstaben, falls das Semikolon fehlt ... ?).
Nun hast Du das nächste Zeichen und kannst prüfen, ob es noch in die
aktuelle Zeile paßt, d. h. ob die Zahl der dort bereits akzeptierten
Zeichen, die Du jeweils um 1 erhöhst, noch kleiner als Dein zulässiger
Maximalwert ist.
Nebenbei findest Du auch gleich alle nicht korrekt terminierten Entitäten.
Viele Grüße
Michael