In theory, you regular expression does work, but the problem is that not all operating system and browsers send only \n at the end of string. Many will also send a \r.
Try:
I’ve simplified this one:
preg_replace("/(\r?\n){2,}/", "\n\n", $text);
And to address the problem of some sending \r only:
preg_replace("/[\r\n]{2,}/", "\n\n", $text);
Based on your update:
// Replace multiple (one ore more) line breaks with a single one.
$text = preg_replace("/[\r\n]+/", "\n", $text);
$text = wordwrap($text,120, '<br/>', true);
$text = nl2br($text);