regex: mehr als 2 Zeilenumbrüche ersetzen
split.s
- perl
Habe folgendes Problem:
Der User kann auf meiner Website kommentare schreiben.
Wie kann ich nun verhindern, dass er mehr als 2 Zeilenumbrüche macht?
In diesem Fall möchte ich die X Zeilenumbrüche dann durch 2 ersetzen.
Beispiel:
$var = "erste Zeile\n\n\n\nZweite Zeile\n\n\nnund so weiter";
soll ersetzt werden zu:
$var = "erste Zeile\n\n\Zweite Zeile\n\n\nund so weiter";
Das Problem: Der regex sollte auch verschiedene Arten von Zeilenumbruch (sendet IE oder Safari auch \n ?) umgehen können.
Bin leider ein totaler Noob was regex angeht und hoffe daher auf etwas Hilfestellung.
Dank vorab!
Grüße,
ich glaube du suchst nach \n\n(\n+)
MFG
bleicher
hi,
Das Problem: Der regex sollte auch verschiedene Arten von Zeilenumbruch (sendet IE oder Safari auch \n ?) umgehen können.
Diese Frage hatten wir hier oft ;)
Nach meiner Erfahrung sendet jeder Browser \r\n (CRLF) als Zeilenumbruch.
Dezimal: 1310, Hex: DA
Hotti
Hi,
Das Problem: Der regex sollte auch verschiedene Arten von Zeilenumbruch (sendet IE oder Safari auch \n ?) umgehen können.
Nach meiner Erfahrung sendet jeder Browser \r\n (CRLF) als Zeilenumbruch.
Darauf würde ich nicht wetten.
Besser ist es, die Zeilenumbrüche erst zu vereinheitlichen (\r\n, \r und \n durch \n ersetzen), und dann die über die Maximalanzahl hinausgehenden zu löschen.
Dezimal: 1310, Hex: DA
Nö, 0xDA wäre dezimal 218.
0x0D 0x0A wären die beiden Zeichen.
MfG ChrisB
0x0D 0x0A wären die beiden Zeichen.
Also doch DA ;)
Weg mit den führenden Nullen, davon gibts genug in der Politik.
Hi,
Nach meiner Erfahrung sendet jeder Browser \r\n (CRLF) als Zeilenumbruch.
Darauf würde ich nicht wetten.
Besser ist es, die Zeilenumbrüche erst zu vereinheitlichen (\r\n, \r und \n durch \n ersetzen),
Richtig. Immer schön defensiv programmieren.
cu,
Andreas
hi,
Das Problem: Der regex sollte auch verschiedene Arten von Zeilenumbruch (sendet IE oder Safari auch \n ?) umgehen können.
$txt =~ s/[\r\n]+/\n\n/g;
danke ChriB ;)
Bin leider ein totaler Noob was regex angeht und hoffe daher auf etwas Hilfestellung.
dann zum Code soviel:
[] legt eine Klasse von Zeichen fest
[\r\n] die "Zeichen" \r und \n gehören nun zur Klasse
[\r\n]+ die Zeichen der Klasse können mehrfach auftreten
Ersetzt wird, egal ob ein \n oder ein \r matscht, jeder match durch \n\n was einheitlich zu einer Leerzeile wird.
\g Jeder Match wird beachtet
Hotti
Hi,
$txt =~ s/[\r\n]+/\n\n/g;
Das würde funktionieren, wenn auch einzelne Zeilenumbrüche ersetzt werden sollen.
Es soll aber erst bei mehr als zweien eine Ersetzung stattfinden.
Und da funktioniert [\r\n] nicht - denn [\r\n]{3,} würde auch schon auf 1,5 Windows-Zeilenumbrüche (\r\n\r) matchen.
(?:\r\n|\n\r|\r|\n){3,} würde passen. Achtung: die Reihenfolge ist entscheidend - zuerst die längeren, dann die kürzeren Auswahlmöglichkeiten (ob noch weitere als die 4 angegebenen Varianten vorkommen, weiß ich nicht, müßten halt ggf. noch eingefügt werden.
Allerdings blieben dann einzelne Windows-Zeilenumbrüche \r\n erhalten und werden nicht zu \n geändert. Das wäre in einem weiteren Schritt zu tun.
[] legt eine Klasse von Zeichen fest
[\r\n] die "Zeichen" \r und \n gehören nun zur Klasse
[\r\n]+ die Zeichen der Klasse können mehrfach auftreten
Ersetzt wird, egal ob ein \n oder ein \r matscht, jeder match durch \n\n was einheitlich zu einer Leerzeile wird.
paßt nur leider nicht zur Aufgabenstellung.
cu,
Andreas
Die anderen Antworten sind unnötig kompliziert. Man schreibt am besten:
s/\R{2,}/\n/msx
Siehe perlrebackslash und perlrecharclass.
Hi,
Die anderen Antworten sind unnötig kompliziert. Man schreibt am besten:
s/\R{2,}/\n/msx
\R kannte ich noch nicht, danke für den Hinweis.
cu,
Andreas
Hi,
Die anderen Antworten sind unnötig kompliziert. Man schreibt am besten:
s/\R{2,}/\n/msx
Siehe perlrebackslash und perlrecharclass.
Danke, \R war mir auch noch nicht bekannt.
Ist offenbar (inzwischen) auch in PHPs PCRE-Implementierung enthalten (zumindest nach Test unter PHP 5.3.8/PCRE Lib 8.12 2011-01-15) - im Handbuch dokumentiert habe ich es aber noch nicht gefunden.
MfG ChrisB
Die anderen Antworten sind unnötig kompliziert. Man schreibt am besten:
s/\R{2,}/\n/msx
Saugut! Du erfüllst Deinen Nick mit Ehre!