Steffi: str_ vs. preg_

Hallo Leute,

wie bekomme ich das unter einem Hut?

//Hier möchte ich \r und \n austauschen:
$text = str_replace("\r", "\n", $_POST["nachricht"]);

//Hier möchte ich nur Buchstaben zulassen, daß passiert auch,
//jedoch wird hier folgerichtig \r und \n ausgeschlossen:
$text = preg_replace("/[^A-Za-z]/", "", $_POST["nachricht"]);

Hat einer eine Lösung?

Gruß
Steffi

  1. hi,

    //Hier möchte ich \r und \n austauschen:
    $text = str_replace("\r", "\n", $_POST["nachricht"]);

    Das, was du laut Kommentar möchtest, tust du aber nicht.

    //Hier möchte ich nur Buchstaben zulassen, daß passiert auch,
    //jedoch wird hier folgerichtig \r und \n ausgeschlossen:
    $text = preg_replace("/[^A-Za-z]/", "", $_POST["nachricht"]);

    Hat einer eine Lösung?

    Nimm doch einfach die beiden Steuerzeichen noch mit in die Zeichenklasse auf.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. hi,

      //Hier möchte ich \r und \n austauschen:
      $text = str_replace("\r", "\n", $_POST["nachricht"]);

      Das, was du laut Kommentar möchtest, tust du aber nicht.

      Ich habe mich glaube ich falsch ausgedrückt: Ich möchte \r gegen \n
      austauschen. Wenn ich beide dann mit preg_ nicht zulasse habe ich
      keinen Umbruch mehr.

      1. hi,

        //Hier möchte ich \r und \n austauschen:
        $text = str_replace("\r", "\n", $_POST["nachricht"]);

        Das, was du laut Kommentar möchtest, tust du aber nicht.

        Ich habe mich glaube ich falsch ausgedrückt: Ich möchte \r gegen \n
        austauschen. Wenn ich beide dann mit preg_ nicht zulasse habe ich
        keinen Umbruch mehr.

        Kannst Du dich mal bitte bemühen, vernünftige Sätze zu formulieren? Was soll denn das heißen

        Wenn ich beide dann mit preg_ nicht zulasse habe ich
        keinen Umbruch mehr.

        $text = preg_replace("/[^A-Za-z]/", "", $_POST["nachricht"]);

        Was soll das bringen? Willst Du Eingaben aus Buchstaben löschen?

        1. $text = preg_replace("/[^A-Za-z]/", "", $_POST["nachricht"]);

          Was soll das bringen? Willst Du Eingaben aus Buchstaben löschen?

          Nein, siehe ^. Es wird alles außer Buchstaben gesucht und durch
          nichts ("") ersetzt. Das heißt es werden nur Buchstaben zugelassen.

          Das Problem dabei ist, daß dann auch \r und \n durch "" ersetzt wird.
          Das heißt \r und \n werden "gelöscht".
          Ich möchte aber daß lediglich \r durch \n ersetzt wird und gleich-
          zeitig alle Buchstaben zugelassen werden.

          Hast Du eine Idee?

          1. Ich möchte aber daß lediglich \r durch \n ersetzt wird und gleich-
            zeitig alle Buchstaben zugelassen werden.

            Hast Du eine Idee?

            Dann nimm doch \r und \n in die Zeichenklasse beim RegEx mit auf und tausch anschließend mit str_replace \r aus.

  2. Guten Morgen Steffi,

    wie bekomme ich das unter einem Hut?

    Wenn ich dein Script, so wie es hier steht ausführe,
    dann kommt bei mir eine Einzeiliger Zeichenwurst
    heraus.
    Da ich aber die anderen Nachrichten im Thread
    gelesen habe, weiß ich dass du die Newlinezeichen
    nicht ersetzen möchtest.

    Nehmen wir mal an, dass du diesen Artikel kennst.

    // Hier möchte ich \r und \n austauschen:
    $text = str_replace("\r", "\n", $_POST["nachricht"]);

    Also \r Carriage-Return durch Linefeed \n ersetzen:

    $text = str_replace("\015", "\012", $_POST["nachricht"]);

    //Hier möchte ich nur Buchstaben zulassen, daß
    passiert auch, jedoch wird hier folgerichtig \r und
    \n ausgeschlossen:
    $text = preg_replace("/[^A-Za-z]/", "", $_POST["nachricht"]);

    Alle Zeichen die keine Buchstaben sind, werden gelöscht.
    Was ja auch richtig ist, das Newline Zeichen, wird
    genau wie das Leerzeichen auch, nicht mit angegeben.
    Wenn du beide erhalten möchtest, sollten dies im
    Ausdruck mit angegeben werden.

    $text = preg_replace("/[^a-zA-Z\s\012]/", "", $_POST["nachricht"]);

    [^  
    a-zA-Z // Alle Buchstabenzeichen, wenn deine [link:http://de.php.net/manual/de/function.setlocale.php@title=Spracheinstellung]  
           // Deutsch ist, dann sind auch die Umlaute (ä,ö,ü)  
           // und das ß als gültige Zeichen enthalten  
    \s     // Das Leerzeichen  
    \012   // Unix Newlinezeichen  
    ]
    

    Hat einer eine Lösung?

    Eventuell mein Obiges Konstrukt, es erhält Buchstaben
    Leer- und Newlinezeichen ersetzt aber alle anderen
    Zeichen.

    gruesse aus'm ruhrpott
      jens mueller

    --
    As long as a single mind remembers, as long as a single heart
    beats with passion, how can a dream die?
    \//_ Live long and prosper
    sh:( fo:) ch:| rl:° br:^ n4:| ie:% mo:| va:} de:> zu:) fl:( ss:) ls:> js:|
    1. Hallo Jens,

      ich hab das jetzt mal so probiert:

      $text = preg_replace("/[^a-zA-Z\s\r\n]/", "", $_POST["nachricht"]);
      $text.= str_replace("\r", "\n", $_POST["nachricht"]);

      Funktioniert soweit, aber er macht beides doppelt, d.h. bei
      folgender Eingabe:

      Test123
      Umbruch

      wird folgendes geliefert:

      TestUmbruchTest123
      Umbruch

      1. Guten Abend Steffi,

        $text = str_replace("\r", "\n", $_POST["nachricht"]);

        Das war mein Fehler, ist mir aber erst nachher
        eingefallen. Mist. (Mea culpa maxima :)
        Der Ausdruck muss noch ein wenig geändert werden,

        $text = str_replace("\012\015|\012", "\015", $_POST["nachricht"]);

        Ohne diese klitze kleine Änderung, werden alle
        einfachen Zeichenumbrüche von Window$, zu doppelten
        Zeilenumbrüchen \n\n ersetzt.

        ich hab das jetzt mal so probiert:

        Ein paar kleine Änderungen:

        $text= str_replace("\012\015|\012", "\015", $_POST["nachricht"])  
        $text = preg_replace("/[^a-zA-Z\s\015]/", "", $_POST["nachricht"]);
        

        Esrtens, die beiden Ausdrücke sind wieder umgedreht,
        das ist einfacher zu Handhaben, und spart am Ende
        Code der wieder zu Fehlern führen kann.

        $text. = str_replace(...);

        $text= str_replace(...);

        Dann ist der Punkt hinter $text weg. Bei dir wurde
        das Ergebnis nämlich hinten dann noch einmal
        an die Variable $text angehängt. (Siehe
        Zuweisungsoperatoren)

        gruesse aus'm ruhrpott
          jens mueller

        --
        As long as a single mind remembers, as long as a single heart
        beats with passion, how can a dream die?
        \//_ Live long and prosper
        sh:( fo:) ch:| rl:° br:^ n4:| ie:% mo:| va:} de:> zu:) fl:( ss:) ls:> js:|
        1. Hi,

          $text= str_replace("\012\015|\012", "\015", $_POST["nachricht"])

          $text = preg_replace("/[^a-zA-Z\s\015]/", "", $_POST["nachricht"]);

            
          Da kann man noch die erste Zeile wegoptimieren (der Wert in $text wird ja eh überschrieben).  
            
          Alternative: in der zweiten Zeile $text anstelle von $\_POST["nachricht"] einsetzen.  
            
          cu,  
          Andreas
          
          -- 
          [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
          [O o ostern ...](http://ostereier.andreas-waechter.de/)  
            
          Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.  
          
          
          1. Hi Andreas,

            $text= str_replace("\012\015|\012", "\015", $_POST["nachricht"]);
            $text = preg_replace("/[^a-zA-Z\s\015]/", "", $_POST["nachricht"]);

              
            
            > Da kann man noch die erste Zeile wegoptimieren  
            > (der Wert in $text wird ja eh überschrieben).  
              
            Ich bin eher ein Anhänger davon - trifft gerade bei  
            Regulären Ausdrücken zu -, dass die Zeilen einfach  
            gehalten werden sollten.  
            Ich meine es so, dass selbst wenn eine Zeile (Klasse,  
            Funktion, .., Kölsch) die Aufgabe von Zwei oder  
            mehren Zeilen (..) übernehmen kann. Dies auf mehrere  
            Zeilen aufzuteilen, um die Einfachheit und um die  
            Nachvollziehbarkeit zu erhalten.  
              
              Wem nutzt ein 15 Zeilen langer Regulärer Ausdruck.  
            Wo man mit sich selbst und dem Ausdruck zuerst  
            einmal 2 Tage in Klausur gehen muss, bis man den  
            Ausdruck (halbwegs?) verstanden hat.  
              
            
            > Alternative: in der zweiten Zeile $text anstelle von $\_POST["nachricht"] einsetzen.  
              
            Danke für den Hinweis mit der Variable, das habe ich  
            irgendwie übersehen. ... Eigendlich wollte ich es auch  
            so posten, habe dann aber den Code nicht durch den  
            Parser gejagt.  
             Mist! Bleibe für fünf Minuten mit der Eselsmütze auf dem  
            Kopf in der Ecke stehen. :o)  
              
            Also Steffi hier nocheinmal korrigiert:  
            
            > > ~~~php
            
            $text= str_replace("\012\015|\012", "\015", $_POST["nachricht"]);  
            
            > > $text = preg_replace("/[^a-zA-Z\s\015]/", "", $text);
            
            

            gruesse aus'm ruhrpott
              jens mueller

            --
            As long as a single mind remembers, as long as a single heart
            beats with passion, how can a dream die?
            \//_ Live long and prosper
            sh:( fo:) ch:| rl:° br:^ n4:| ie:% mo:| va:} de:> zu:) fl:( ss:) ls:> js:|
            1. Hi,

              $text= str_replace("\012\015|\012", "\015", $_POST["nachricht"]);

              $text = preg_replace("/[^a-zA-Z\s\015]/", "", $_POST["nachricht"]);

              
              >   
              > > Da kann man noch die erste Zeile wegoptimieren  
              > > (der Wert in $text wird ja eh überschrieben).  
              >   
              > Ich bin eher ein Anhänger davon - trifft gerade bei  
              > Regulären Ausdrücken zu -, dass die Zeilen einfach  
              > gehalten werden sollten.  
                
              Du hast mich vermutlich falsch verstanden. Ich meinte nicht, daß alles in eine Zeile gepackt werden sollte.  
              Ich meinte das so, daß Deine erste Zeile überflüssig ist, da Deine zweite Zeile ja das Ersetzungsergebnis der  
              ersten Zeile komplett ignoriert.  
                
              (ich hätte doch noch ein ;-) dahintersetzen sollen)  
                
              cu,  
              Andreas
              
              -- 
              [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
              [O o ostern ...](http://ostereier.andreas-waechter.de/)  
                
              Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.  
              
              
              1. Hi Jens und Andreas! :-)

                Ich hab das jetzt so gemacht und läuft! Es werden nun die Umbrüche
                gemacht und alles außer Buchstaben wird gelöscht. Ob es allerdings
                so korrekt programmiert ist, weiß ich nicht. Kann man das so
                machen???

                $suchmuster = array ("/[\r]/", "/[^a-zA-Z\r\n]/");
                $ersetzen = array ("/[\n]/", "");
                $text = preg_replace($suchmuster, $ersetzen, $_POST["nachricht"]);

                Gruß
                Steffi