Im Regex:
+
bedeutet "eins oder mehr von dem vorherigen Ausdruck"
{2,}
bedeutet "zwei oder mehr von dem vorherigen Ausdruck"
Für die Anforderungen in dieser Frage macht es keinen Sinn, ein einzelnes \n
durch ein einzelnes \n
zu ersetzen, weil sich für diesen Teilstring nichts ändert. Mit anderen Worten, /\n+/
macht einfach mehr Arbeit als nötig.
Es macht viel mehr Sinn, einen Bereichsquantifizierer von zwei oder mehr zu verwenden.
Code: (Demo)
$string = "James hat hallo gesagt\n\n\n\n Test\n Test zwei\n\n";
echo json_encode(
preg_replace("/\n{2,}/", "\n", $string)
);
Ausgabe:
"James hat hallo gesagt\n Test\n Test zwei\n"
In anderen Situationen kann es vorteilhaft sein, Zeilenumbruchsequenzen, die von verschiedenen Betriebssystemen stammen könnten, mit \R
zu ersetzen. Dieses Metazeichen passt zu \r\n
oder \n
. Hier ist ein modifiziertes Muster, das zwei oder mehr Zeilenumbruchsequenzen durch die vom Server festgelegte Zeilenumbruchzeichenfolge ersetzt:
$string = "James\r\n hat\n\r\n hallo\r\n\r\n\r\n Test\n Test zwei\n\n";
echo json_encode(
preg_replace("/\R{2,}/", PHP_EOL, $string)
);
// "James\r\n hat\n hallo\n Test\n Test zwei\n"
// ^^^^----als eine Zeilenumbruchsequenz behandelt