Grazie Marketto!
Il problema è scomparso.

Ho fatto un test...

preg_match("/^[^<>;]+$/", $stringa_di_testo); // nessun'altro parametro aggiunto

...che impedisse l'inserimento di alcuni caratteri e già così funziona anche con testi lunghi.

Come si può vedere ho modificato l'espressione regolare invertendo il ragionamento (non più cosa deve passare ma cosa non deve passare... che poi è più semplice).

Per badaze:
se ho messo il controllo (penso tu intenda l'espressione regolare) ci sono dei motivi che vanno al di la di htmlspecialchars() e simili.
Per strlen ok ma visto che adesso uso preg_match il controllo lenght lo posso fare con questa funzione.

Grazie anche ad html.it. Sin dagli albori di Internet è sempre stata un punto di riferimento coi fiocchi.