$testo = preg_replace('/([\!]{3,})/', '!!!', $testo);

dovrebbe funzionare ma non ricordo la sintassi esatta ... ovvero se basta mettere 3, per indicare che almeno ci devono essere 3 blocchi dei caratteri indicati tra le quadre

cmq prova dovrebbe andare