7 Stimmen

Ersetzen Sie mehrere neue Zeilen durch eine einzelne neue Zeile

Wie kann ich mehrere aufeinander folgende Zeilenumbrüche durch einen Zeilenumbruch ersetzen? Es könnten bis zu 20 Zeilenumbrüche nebeneinander sein. Zum Beispiel

James sagte hallo\n\n\n\n Test\n Test zwei\n\n

Sollte am Ende so aussehen:

James sagte hallo\n Test\n Test zwei\n

11voto

kovshenin Punkte 30295

Versuchen Sie es mit diesem:

$str = "Hallo\n\n\n\n\nWelt\n\n\nWie\nGeht\n\nEs?";
$str = preg_replace("/\n+/", "\n", $str);
print($str);

4voto

Danny Staple Punkte 6667

Verbesserung von Marcs Antwort:

$fixed_text  = preg_replace("\n(\s*\n)+", "\n", $text_to_fix);

Dies sollte eine anfängliche Neue Zeile auswählen, dann mindestens eines einer Gruppe von beliebiger Menge von Leerzeichen gefolgt von einer Neuen Zeile und alles durch eine einzelne Neue Zeile ersetzen.

1voto

Marc B Punkte 347897
$fixed_text = preg_replace("\n+", "\n", $text_to_fix);

Dies sollte funktionieren, vorausgesetzt, dass die aufeinanderfolgenden Zeilenumbrüche wirklich aufeinanderfolgend sind und keinen Platz (Tabs, Leerzeichen, Wagenrückläufe usw.) zwischen ihnen haben.

0voto

Alex Pliutau Punkte 20530
$str = 'James sagte hallo\n\n\n\n Test\n Test zwei\n\n';
echo preg_replace('{(\\\n)\1+}','$1',$str);

0voto

mickmackusa Punkte 36793

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X