Попробуйте:
preg_replace('!(?<!\n)\n(?!\n)!', '', $input);
См. Утверждения Lookahead и Lookbehind Zero-Width о том, как это работает.
При этом удаляются все новые строки, которые не предшествуют или не следуют за новой строкой. Вы должны сделать и другое, если у вас есть это комбо:
This is some text\n\n
тогда первая не будет совпадать (новая строка не сопровождается новой строкой), так как за ней следует новая строка, но вторая будет, потому что за ней не следует новая строка (но перед ней стоит одна).
В качестве альтернативы вы можете сделать:
preg_replace_callback('!\n+!', 'replace_newline', $input);
function replace_newline($matches) {
return strlen($matches[0]) == 1 ? '' : $matches[0];
}
Также я предположил, что вы имеете в виду только переводы строк, а не \ r. Для этого можно отрегулировать любое решение.