Zeilenumbrüche
Jens Irrgang
- cgi
0 klaus0 Cheatah0 Jens Irrgang
Hallo an alle Forumler,
entweder ist die späte Zeit, oder aber mein Brett vor dem Kopf.
Ich suche eine Möglichkeit, mehrfache Zeilenumbrüche auszufiltern.
Jetzt habe ich schon die folgende Funktion gefunden:
$Text =~ s/[\n\r]+/<br>/g;
Damit werden mehrfach Zeilenumbrüche getilt. Soweit so gut. Damit werden aber alle bis auf einen gelöscht. Jetzt will ich aber zumindest zwei Zeilenumbrüche erlauben, damit Absätze wie oben mit einer freien Zeile möglich sind. Und damit beginnt mein Problem.
Ich habe einen Lösungsansatz gefunden, aber damit habe ich immer mindestens zwei Leerzeilen hintereinander.
Das ganze soll in einem Gästebuch zum Tragen kommen, damit Witzbolde nicht die Möglichkeit haben mir damit mein Gästebuch voll zu müllen (ok - ich weiß schon das es noch andere Möglichkeiten gibt).
Vielen Dank im voraus
Jens
Hallo Jens,
Mir fällt gerade nicht _die_ultimative regex ein. Ich würde das so machen
$Text =~ s/\n\r/\n/g;
$Text =~ s/\r\n/\n/g;
$Text =~ s/\n{3,}/\n\n/g;
$Text =~ s/\n/<br>/g;
Sicherlich gibts da noch effizentere Methoden, aber was solls, so dürfte es wenigstens funktionieren
Grüße
Klaus
Hi,
Jetzt will ich aber zumindest zwei Zeilenumbrüche erlauben, damit Absätze wie oben mit einer freien Zeile möglich sind.
my $umbruch = '(\015\012\015\012)';
s/($umbruch{2})$umbruch+/$1/g;
(ungetestet)
Cheatah
Hi JEns,
my $umbruch = '(\015\012\015\012)';
s/($umbruch{2})$umbruch+/$1/g;
Also, siehst Du, es geht doch schlauer, aber ich hätte da noch eine ergänzung parat
my $umbruch = '(\012\015\015\012\015\012)'; #alles ist möglich
s/($umbruch{1,2})$umbruch+/$1/g; # und einen, aber nicht keinen, wollen wir doch auch zulassen
(ebenfalls ungetestet)
Klaus
Hallo allerseits,
Hi JEns,
my $umbruch = '(\015\012\015\012)';
s/($umbruch{2})$umbruch+/$1/g;
s/($umbruch{1,2})$umbruch+/$1/g; # und einen, aber nicht keinen, wollen wir doch auch zulassen
So matched RE bereits auf zwei $umbruch und ersetzt diese dann mit nur einem $umbruch. Bei einer "richtigen" Eingabe wuerde also die leere Zeile entfernt werden.
(ebenfalls ungetestet)
s/($umbruch{2})$umbruch+/$1/g;
getestet - funktioniert !
Klaus
Gruss
Kai
Hallo,
jo mei, waun ma net ois genau duachschaut, daun sch.. an eini.
Woust recht host, host recht.
Grüße
Klaus
Hi,
my $umbruch = '(\012\015\015\012\015\012)'; #alles ist möglich
nein, ist nicht. Im Zweifel reagiert diese Regexp bereits auf \r(\n\r)\n, was nicht das gewünschte Ergebnis erzielt - \012\015 kommt nicht vor.
s/($umbruch{1,2})$umbruch+/$1/g; # und einen, aber nicht keinen, wollen wir doch auch zulassen
Siehe Kais Antwort :-)
Cheatah
»» ... \012\015 kommt nicht vor.
Bist Du Dir da so ganz sicher?
Es gibt Systeme, wo '\n\r' vorkommen kann und solche , wo '\r\n' vorkommt. Siehe (MAc, PC, VMS, Unix...), jeder wills anders.
Trotzdem würde ich, bevor ich HTML-Breaks einfüge, das ganze dahingehend korrigieren, daß nur mehr '\n' vorkommen. Alle Kombinationen würde ich zuerst wegfiltern. (Siehe meine erste Antwort)
Das ist zwar langsamer, aber sicherer.
Grüße
Klaus
Hi,
»» ... \012\015 kommt nicht vor.
Bist Du Dir da so ganz sicher?
ja.
Es gibt Systeme, wo '\n\r' vorkommen kann
Nenn mir bitte eins.
Das genannte Pattern ist kampferprobt und wird von Profis verwendet. Es würde mich doch arg wundern, wenn diese im Laufe der Jahre den Fehler nicht bemerkt hätten.
(MAc,
\r
PC,
\r\n (Du meinst sicher Win *g*)
VMS,
\n AFAIK
Unix...),
\n
Trotzdem würde ich, bevor ich HTML-Breaks einfüge, das ganze dahingehend korrigieren, daß nur mehr '\n' vorkommen. Alle Kombinationen würde ich zuerst wegfiltern. (Siehe meine erste Antwort)
Also sinngemäß s!\r\n!\n!g; s!\r!\n!g; s!\n!<br>!g; ? Ich weiß ja nicht, wie das mit Dir ist, aber ich achte gelegentlich auch auf Performance... :-)
Das ist zwar langsamer, aber sicherer.
Nicht wirklich.
Cheatah
Hi,
Nenn mir bitte eins.
Na, zum Beispiel eben VMS. Ich weiß dieses OS ist ja eigentlich off-topic, aber rumschlagen muß ich mich auch damit
Also sinngemäß s!\r\n!\n!g; s!\r!\n!g; s!\n!<br>!g; ?
nein:
$Text =~ s/(\015\012\012\015\015\012)/\n/g;
$Text =~ s/\n{3,}/\n\n/g;
$Text =~ s/\n/<br>/g;
$umbruch = '(\015\012\012\015\015\012)';
funktioniert allein schon deshalb genausogut, weil Perl ja versucht, die ersten optionen zuerst aufzulösen.
(getestet)
Ich weiß ja nicht, wie das mit Dir ist, aber ich achte gelegentlich auch auf Performance... :-)
sicherlich achte ich auch auf die Performance, aber die Stabilität ist für mich immer wesentlicher.
Das ist zwar langsamer, aber sicherer.
Nicht wirklich.
Probiers einfach aus.
Klaus
Danke an Cheatah, klaus und Kai,
ich werde die gegebenen Antworten austesten. Vielen Dank für eure Antwort.