$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