Bis zu zwei Zeilenumbrüche erlauben

Hallo allerseits,

Ich baue mir gerade eben ein Gästebuch zusammen. Dabei ist es auch logisch, dass Platz gespart werden soll und somit niemand hunderte von Zeilenumbrüche posten soll. Also hab ich mir gedach, ersetze ich halt alle Zeilenumbrüche jeweils durch einen:
[PHP]<?php preg_replace('/(?:[ \t]*(?:\n|\r\n?)){2,}/', "\n", $meintext) ?>[/PHP]

Das klappt soweit auch ganz gut, nur sieht es ziemlich unästhetisch aus, wenn so wenig Abstand zwichen zwei Absätzen ist. Also wollte ich das Maximum auf zwei Zeilenumbrüche hintereinander beschränken. Nur hab ich Probleme bei dessen Umsetzung. Denn ich kann ja schlecht den obrigen Code durch
[PHP]<?php preg_replace('/(?:[ \t]*(?:\n|\r\n?)){2,}/', "\n\n", $meintext) ?>[/PHP]
ersetzen, da dann selbst ein Zeilenumbruch zu zwei wird. Das will ich aber gar nicht. Ich hätte gerne bei einem Zeilenumbruch einen, bei zwei Zeilenumbrüchen zwei und bei mehr als zwei ebenfalls zwei als Output.

Hat jemand eine Idee, wie ich mein Vorhaben umsetzen kann?

Das ganze mit einer Schleife zählen?

Mit einer if-Schleife? Das ist auch mein Denkansatz gewesen, aber wie kann ich denn abfragen, ob jeweils 1, 2 oder mehr als 2 Zeilenumbrüche hintereinander gepostet worden sind? Denn dann könnte ich abfragen wenn 1 ZU oder 2 ZU-> echo1 / else wenn >2 echo2, jetzt mal etwas abstrakt dargestellt
Aber wie kann ich denn verifizieren, wie viele Zeilenumbrüche hintereinander gemacht worden sind. Dabei mussdann ja auch noch beachtet werden, dass nicht nur 1 oder 2 Zeilenumbrüche imPost sein dürfen,sondern jeweilshintereinander. Es dürfen an sich also auch 3,4 oder 100 sein,nur eben nicht hintereinander. Einfach eine Count-funktion fällt daher schon mal weg. Wie geht das also?

Damit wirst du nicht weiterkommen, denn sowas gibt es nicht :smiley:

Eine if-else Abfrage habe ich gemeint. Ach so, jetzt verstehe ich, eine Schleife. Aber das ist mir jetzt irgendwie noch fremder. Könnt ihr mir erklären, wie ich dafür vorgehen soll. Mag sein, dass ich etwas auf der Leitung sitze, aber ich kann mir beim besten Willen nicht vorstellen,wie das in einer Schleife umsetzbar sein soll.

Wie wärs damit, die Reihenfolge einfach umzukehren?

Zuerst alle \n\n\n durch \n ersetzen.
Dann noch die übrigen \n\n wieder durch \n ersetzen.
Einzelne \n unberührt lassen.

Mit einem while-loop kannst du dann auf Nummer sicher gehen. Also obiges wiederholen bis kein \n\n mehr vorhanden ist.

Bin mir jetzt zwar nicht 100% sicher ob das dann auch passt aber kannst du ja mal versuchen.

Also erst mal zum Ersetzen. Wenn, dann würde ich die \n\n\n durch \n\n ersetzen und die \n\n und \n unberührt lassen. Und wenn ich das richtig verstehen, sollte ich die while-Schleife dafür benutzen, um das ganze so lange durchzuspielen, bis keine dreifachen oder vierfachen \n 's mehr da sind, richtig?

Ich frage mich nur, ob diese Schleife überhaupt Sinn macht, oder einfach nur unnötig Ressourcen verbraucht. Denn eigentlich müsste es doch genügen, die ganzen \n\n\n und \n\n\n\n 's mit str_replace gegen nichts zu ersetzen,also aufzulösen. Dann bleiben, egal wie, nur noch die \n\n und \n übrig, oder hab ich mich da irgendwie verrechnet?

Aber sowieso ist das eine relativ primitive Lösung. Könnte ich nicht eine einfache else-if Abfrage machen, also abfragen, ob mehr als 2 Zeilenumbrüche hintereinander kommen und wenn ja, diese dann durch zwei zu ersetzen. Das wäre wesentlich eleganter, nur weiß ich nicht, wie ich mich hierfür anlegen soll. Kann mir da jemand weiterhelfen?

Ja, ich denke eben auch dass es ohne Schleife geht. Bin mir nur nicht sicher.

\n\n\n\n\n (5x) würde halt zu \n\n
Aber das ist ja sowieso das was du willst.

EDIT: Habe deine Frage nochmal genauer durchgelesen. Du willst:
\n\n\n → \n\n
\n\n → \n\n
\n → \n

Für sowas brauchst du die Schleife:

Das hier
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
würde ohne Wiederholung (Schleife) zu
\n\n\n\n\n

Dann lass mich mal überlegen. Angenommen, ich ersetze immer 4x \n durch \n\n und 3x \n durc \n\n, dann kommt heraus (vorausgesetzt, zuerst wird der 4x, dann erst der 3x ausgeführt:

1x \n => \n
2x \n => \n\n
3x \n => \n\n
4x \n =>\n\n
5x \n =>\n\n
6x \n => \n\n\n
7x \n =>\n\n\n
8x \n => \n\n
9x \n => \n\n\n
10x \n => \n\n\n\n

Fazit: Nein, das klappt so nicht. Dann müsst ich tatsächlich das ganze mehrere Male durchlaufenlassen,oder aber, und das wäre wohl definitiv die zu bevorzugende Alternative, das ganze mit 'ner else-if Abfrage zu realisieren. Aber mit welchem Befehl könnte ich das Abfragen?

Edit (bezogen auf dein Edit): Und wie sollte ich mich dafür am besten anlegen?

[PHP]$text = ‚\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n‘;

while(preg_match(‚\n\n\n‘, $text)) {
$text = preg_replace(‚\n\n\n‘,‚\n\n‘,$text);
}[/PHP]

Das ist jetzt Pseudo-PHP, aber ich denke das sollte so funktionieren.
So gibt es nie mehr als zwei \n\n nacheinander.

Naja, nur dass der Compiler hier rumspinnt da das Trennsymbol bei der preg_match-Funktion fehlt. Ist aber ansonsten ein sehr interessanter Ansatz, muss ich zugeben. Nur wird es ohne Schrägstrich oder ein anderes Trennsymbol an Anfang und Ende wohl kaum funktionieren.

Um jetzt zurück auf die else-if Methode zu kommen: Gibt es eigentlich eine Möglichkeit, einzelstehende (bzw. doppelte) Symbole (in diesem Fall also /n und \n\n) herauszufiltern, bzw. zu erkennen? Dann könnten diese nämlich z.B. durch Codierung ersetzt werden und der ganze Rest aufgelöst. Wäre dies nicht die wesentlich elegantere / resoourcensparendere / schneller Methode? Und wie sollte ich mich dafür anlegen?

ihr wollt was machen?
Also als erstes gibt es nicht nur \n als zeilenumbruch sondern auch \r\n unter windows und \r unter mac.
Ihr müsst also erstmal normalisieren.

[php]$sText = ‚…‘;
$sText = str_replace(array(„\r\n“, „\r“), „\n“, $sText);[/php]

Und jetzt wollt ihr alle mehrfach auftauchenden Zeilenumbrüche durch zwei ersetzen.

[php]$sText = preg_replace(„/\n{2,}/“, „\n\n“, $sText);[/php]

Fertig

Jep, ist wohl der bessere Ansatz - RegExp sind nicht mein Fall :wink:
Das Normalisieren hat er schon im ersten Beitrag gemacht.

Naja und noch ne kleine Info, wenn dich jemand vollspamen will dann wird die Person so persistent sein, dass sie auch diesen „Code“ knackt und einfach soetwas schreibt.

„\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na\n\na“

Eine Bessere Lösung ist es wohl einfach alle sicherheitsmaßnahmen zu treffen. Wenn du kein Forum betreibst sondern nur Kommentare zulässt begrenze die anzahl der Zeichen einfach auf ein akzeptables maß. Bau ein einfaches Captcha.
Meistens reicht schon eine simple textausgabe wie [1-5] + [1-4]. Baue ein Benutzersystem in welchem Registrierte Benutzer sachen Posten dürfen die sofort angezeigt werden (oder auch erst akzeptiert werden müssen). Gast besucher dürfen posten (oder auch nicht) aber du musst als admin dem post erst zustimmen damit er öffentlich erscheint.

Wenn Spam zu einem Problem wird baue funktionen mit denen du alle kommentare von einer IP oder einem Registriertem Benutzer auf einmal löschen kannst.

Ach und am ende. Anstadt mehrere zeilenumbrüche in 2 umzuwandeln kannst du doch viel besser richtiges HTML schreiben und alles in 1 zeilenumbruch umwandeln und an der stelle teilst du einfach deinen text und fügst <\p>

ein.

[php]$sText = „asd\nasdasd asdasd asdasd\n asdasd asd asd sad“;
?>

<?= implode('

', explode("\n", $sText)) ?>

[/php]

lg

Oh, dann danke ich euch allen erst mal für eure Ansätze/Ideen.:slight_smile:
Ich denke, dann werde ich eine Schleife machn, bei der ich immer alle dreifachen Zeilenumbrüche gegen zwei Zeilenumbrüche austausche, so lange, bis nur noch zwei übrig sind. Ansonsten, was müsste ich sonst noch beachten. Einmal darauf achten, „\r\n“ und „\r“ in „\n“ umzuwandeln. Gibt es sonst keine mehr? Z.B. \n\t oder \t oder sonst was? Oder gibt es villeicht eine effektivere Methode, PHP mitzuteilen, alle Zeilenumbrüche auszutauschen. Ich hab jetzt mal zum Test mit method: post getestet, was im Falle eines Zeilenumbruches abgesendet wird. Bei mir wars „%0D%0A“. Wie muss ich das berücksichtigen, oder gibt es villeicht einen String um PHP mitzteilen, dass jede Form von Zeilenumbruch umgewandelt werden soll?

Wieso willst du nun ne schleife bauen? Guck dir meinen Post an. Vergiss was alle anderen über ersetze X Zeilenumbrüche gesagt haben… :frowning: Die meinen es zwar gut aber es ist einfach falsch.

Forms kannst du nichts mitteilen was dir großartig helfen wird. Das einzige was dein Ergebniss beeinflussen könnte ist das Charset in welchem du deine Seite Geschrieben hast. In deinen Developer Tools solltest du unter Netzwerk die Header der aktuell geladenen Seite sehen und dort sollte wenn möglich utf8 stehen.

Alle deine Entwickler tools sollten auch auf utfz stehen damit am Ende alles stimmt.

Wenn du irgendwo ein ergebniss wie %xx rausbekommst dann ist irgendwo in deinem code ein urlencode, ansonsten kann ich es mir nicht erklären.

Wenn du irgendwo ein ergebniss wie %xx rausbekommst dann ist irgendwo in deinem code ein urlencode, ansonsten kann ich es mir nicht erklären.

Erst mal hierzu: Abgefangen hab ich den „%0D%0A“ Zeilenumbruch vor dem Senden mit dem Firefox Add-On TamperData. Also bevores überhaupt den server erreicht hat. Wenn ich das richtig verstanden habe findet diese konversion nur beim Senden statt, entspricht das %xy in wirklichkeit /z. Also brauche ich dass dann wohl nicht zu beachten.

Wieso willst du nun ne schleife bauen? Guck dir meinen Post an. Vergiss was alle anderen über ersetze X Zeilenumbrüche gesagt haben… :frowning: Die meinen es zwar gut aber es ist einfach falsch.

Das heißt, ich soll keine Schleife einbauen? Ich dachte, das sei nun die effektivste Methode, um mein Vorhaben umzusetzen. Wenn ich deine Idee im Post [B]#14[/B] richtig verstanden habe, soll ich alle Zeilenumbrüche, die an den server gesendet werden in „


“ (nur einmal) umwandeln, hab ich das richtig verstanden? Und wenn ja, was wäre dann der Vorteil, also der Grund, dies einer Schleife vorzuziehen?

Der Vorteil liegt hauptsächlich in der Performance, wobei der Unterschied sicherlich nicht gigantisch ist.
Durch die richtige Regular Expression, sind nämlich sowohl Schleife als auch preg_match überflüssig.

Bei den

geht es darum, die Benutzereingaben in „gutes“ HTML umzuwandeln:
Schlecht:
[HTML]Absatz 1



Absatz 2
[/HTML]
Gut:
[HTML]

Absatz 1

Absatz 2

[/HTML]

Ach so, okay, aber wenn es auch
[HTML]Absatz 1



Absatz 2[/HTML]
als Ergebniss ist,wäre ich auch noch zufrieden damit. Selbst der IE könnte damit umgehen. Ob das jetzt valide ist, ist mir dann auch ziemlich Wurscht.

Ansonsten, wie könnte ich das denn genau OHNE Schleife umsetzen, was sicherlich Ressourcen-schonender wäre. Mit if-else ja wohl kaum, da es die dafür benötigte Funktion (meines Wissens nach) nicht gibt. Kannst du deine Idee villeicht etwas genauer schildern, damit ich sie nachvollziehen kann?

Bis zu zwei Zeilenumbrüche erlauben
Bis zu zwei Zeilenumbrüche erlauben
oder wenn du wirklich
willst: http://ch2.php.net/manual/en/function.nl2br.php