split.s: regex: mehr als 2 Zeilenumbrüche ersetzen

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!

  1. Grüße,
    ich glaube du suchst nach \n\n(\n+)
    MFG
    bleicher

    --
    __________________________-

    FirefoxMyth
  2. 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

    1. 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

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
      1. 0x0D 0x0A wären die beiden Zeichen.

        Also doch DA ;)

        Weg mit den führenden Nullen, davon gibts genug in der Politik.

      2. 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

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  3. 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

    1. 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

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  4. Die anderen Antworten sind unnötig kompliziert. Man schreibt am besten:

    s/\R{2,}/\n/msx

    Siehe perlrebackslash und perlrecharclass.

    1. 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

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    2. 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

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    3. Die anderen Antworten sind unnötig kompliziert. Man schreibt am besten:
          s/\R{2,}/\n/msx

      Saugut! Du erfüllst Deinen Nick mit Ehre!