Non so se una regexp è più elegante. Comunque.

Codice PHP:
<?php
$pattern 
"/\s{2,}/";

$str1 "Oggi   è     una         brutta giornata    del  cavolo";  
print 
"Prima : $str1<br/>";
$str2 preg_replace($pattern,' ',$str1);
print 
"Dopo : $str2<br/>";
?>