Kai: Ich bekomme die Leerzeilen nicht raus

Hallo,

hab schon alles versucht, aber selbst

  
$test = str_replace(chr(10).chr(10),'',$test);  
$test = str_replace(chr(13).chr(13),'',$test);  
$test = str_replace(chr(10).chr(13),'',$test);  
$test = str_replace(chr(13).chr(10),'',$test);  
$test = str_replace("\n\n", "", $test);  

bringt das gewünschte Ergebnis nicht.

Im (html)-Ausgabecode habe ich im $test-Feld immer noch \n\n drinne.

Wie beseitige ich die denn? Bzw. wie bringe ich sicher in Erfahrung, welche Zeichenfolge da vorliegt? Muß ich da wirklich über einen Hex-Editor gehen?

Kai

  1. Moin!

    Im (html)-Ausgabecode habe ich im $test-Feld immer noch \n\n drinne.

    Definiere "\n\n". Woher weißt du, dass es zwei \n sind, und keine \r\n-Kombination?

    - Sven Rautenberg

    1. Definiere "\n\n". Woher weißt du, dass es zwei \n sind, und keine \r\n-Kombination?

      Na eben das weiß ich ja nicht.
      Es steht in der html-Ausgabe aber "schwarz auf Monitor" \n\n dort.
      Kai

  2. Hallo,

    dafür gibt es doch trim

    weitermachen...

    1. Hallo,

      dafür gibt es doch trim

      weitermachen...

      ...hatte ich bereits zuvor angewendet. Hilft nicht.

      Kai

      1. Hallo,

        dafür gibt es doch trim

        weitermachen...

        ...hatte ich bereits zuvor angewendet. Hilft nicht.

        Kai

        Das gänge auch:

        function umstaendlicher_leerzeilen_entferner($str) {
            $str=str_replace("\r", "\n", $str);
            $ar=explode("\n", $str);
            $str='';
            foreach ($ar as $s) {
                $s=trim($s, "\r\n");
                if ($s) {
                  $str .= $s;
                  $str .= "\n"; # Ein Zeilenumbruch soll ja erhalten bleiben
                }
            }
            return $str;
        }

        Nur ist das eben sehr umständlich, weil es auch mit zwei Zeilen geht.

        fred

  3. Siehe Handbuch

  4. $test = str_replace(chr(10).chr(10),'',$test);
    $test = str_replace(chr(13).chr(13),'',$test);
    $test = str_replace(chr(10).chr(13),'',$test);
    $test = str_replace(chr(13).chr(10),'',$test);
    $test = str_replace("\n\n", "", $test);

      
    Das sieht ja hübsch planlos aus...  
      
    Du willst alle Leerzeilen entfernen und weisst nicht, wie das Zeilenende angelegt ("\r\n", "\r" oder "\n") ist.  
      
    Ok, erster Schritt:  
      
    ersetze alle \r durch \n:  
      
    `$test = str_replace("\r","\n",$test);`{:.language-php}  
      
    Und jetzt kannst entweder mit einem Regex oder mit str\_replace die doppelten "\n" rauswerfen:  
      
    ~~~php
    $flag=1;  
    while ($flag) {  
       $test = str_replace("\n\n","\n",$test, &$flag);  
    }
    

    oder:

    $test = [link:http://www.php.net/manual/de/function.preg-replace.php@title=preg_replace]("/\n{2,}/", "\n", $test);

    fred

  5. Hi,

    Im (html)-Ausgabecode habe ich im $test-Feld immer noch \n\n drinne.

    jetzt mal im Ernst: Hast du zwei Zeilenumbrüche (also Steuerzeichen \n) oder die Zeichenfolge "Backslash und n"? Das wäre schon mal ein ganz erheblicher Unterschied.

    Wenn du in der HTML-Ausgabe (und auch in der Quellcode-Ansicht des Browsers) die Zeichen '' und 'n' siehst, ist es auf jeden Fall kein Zeilenumbruch, sondern die beiden ASCII-Zeichen 0x5C und 0x6E separat.

    Wie beseitige ich die denn? Bzw. wie bringe ich sicher in Erfahrung, welche Zeichenfolge da vorliegt? Muß ich da wirklich über einen Hex-Editor gehen?

    Das wäre die beste Möglichkeit; dann weißt du es *sicher*.

    Ciao,
     Martin

    --
    Wieso heißen die Dinger eigentlich Anrufbeantworter? Eigentlich sind es doch nur Anrufanhörer.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  6. Lieber Kai,

    Dein Code

    $test = str_replace(chr(10).chr(10),'',$test);

    $test = str_replace(chr(13).chr(13),'',$test);
    $test = str_replace(chr(10).chr(13),'',$test);
    $test = str_replace(chr(13).chr(10),'',$test);
    $test = str_replace("\n\n", "", $test);

    lässt sich kürzer schreiben und ergibt das gleiche Ergebnis:  
      
    `$test = preg_replace('~(?s)[\r\n]{2}~', '', $test);`{:.language-php}  
      
    
    > Im (html)-Ausgabecode habe ich im $test-Feld immer noch \n\n drinne.  
      
    Wenn Du nicht weißt, was da "unterwegs" passiert, dann benötigst Du eine Kontrollausgabe:  
      
    `file_put_contents('./debug.txt', $test);`{:.language-php}  
      
    Damit hast Du den exakten Inhalt der Variablen $test in einer Text-Datei stehen, egal was später in Deiner Webanwendung mit dem HTML-Code noch passiert.  
      
    Hast Du etwa so ein Dings wie HTML-Purifier oder Tidy auf dem Server, der nach PHP den Code noch manipuliert?  
      
    Im Übrigen solltest Du Deine Anwendung so schreiben, dass sie nicht auf exakte Vorgaben bei Zeilenumbrüchen angewiesen ist. Dafür eigenen sich diese preg\_\*-Funktionen sehr gut. Man kann damit sehr flexibel auf jeglichen HTML-Code losgehen, um seine Manipulationen trotz irgendwelcher Varianten im Code an der richtigen Stelle vorzunehmen. RegExe lohnen sich extremst!  
      
    Liebe Grüße,  
      
    Felix Riesterer.
    
    -- 
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    
    1. Hallo Felix,

      $test = preg_replace('~(?s)[\r\n]{2}~', '', $test);

      Ui. Diese regulären Ausdrücke :-)

      Im Übrigen solltest Du Deine Anwendung so schreiben, dass sie nicht auf exakte Vorgaben bei Zeilenumbrüchen angewiesen ist. Dafür eigenen sich diese preg_*-Funktionen sehr gut. Man kann damit sehr flexibel auf jeglichen HTML-Code losgehen, um seine Manipulationen trotz irgendwelcher Varianten im Code an der richtigen Stelle vorzunehmen. RegExe lohnen sich extremst!

      Sind aber auch extremst schwierig zu beherrschen ;-)

      Wenn Du nicht weißt, was da "unterwegs" passiert, dann benötigst Du eine Kontrollausgabe:

      file_put_contents('./debug.txt', $test);

      Habe ich gemacht. Die enthält dann letztlich nur die letzte Zeile aller Strings, die per Schleife durchforstet werden.

      Übrigens, der Hex-Code für meine \n\n ist 0A0A.

      Kai

      1. In der Original-CSV-Datei sind die Leerzeilen 0A0A

        Nach Behandlung mit:

          
        $test = preg_replace('~(?s)[\r\n]{2}~', '', $test);  
        
        

        und Eitrag in debug.txt

        [code lang=php]file_put_contents('./debug.txt', $test);

        sind aus den 0A0A der Ursprungsdatei nun 5C6E5C6E geworden, was \n\n entspricht.

        Und nun?

        Kai

        1. In der Original-CSV-Datei sind die Leerzeilen 0A0A

          Nach Behandlung mit:

          $test = preg_replace('~(?s)[\r\n]{2}~', '', $test);

          
          >   
          > und Eitrag in debug.txt  
          >   
          > ~~~php
          
          file_put_contents('./debug.txt', $test);  
          
          >   
          > sind aus den 0A0A der Ursprungsdatei nun 5C6E5C6E geworden, was \n\n entspricht.  
          >   
          > Und nun?  
            
          Nimm stets nur Code, den Du auch verstehst.  
          Habe ich Deine Aufgabe richtig verstanden? Leerzeilen sind solche, die außer Zeilenumbrüchen NICHTS enthalten. Oder willst Du was anderes?  
            
          [code lang=php]<?php  
          $test='Hallo'  
          . "\r\n\r\n"  
          . "\n\n"  
          . "\r\r"  
          .'  
            
          Welt!  
          ';  
            
          function effektiver_leerzeilen_entferner($str) {  
              $str=str_replace("\r", "\n", $str);  
              return  preg_replace("/\n{2,}/", "\n", $str);  
          }  
            
          function kaum_umstaendlicher_leerzeilen_entferner($str) {  
              $str=str_replace("\r", "\n", $str);  
              $flag=1;  
              while ($flag) {  
          	$str = str_replace("\n\n","\n",$str, &$flag);  
              }  
              return $str;  
          }  
            
          function umstaendlicher_leerzeilen_entferner($str) {  
              $str=str_replace("\r", "\n", $str);  
              $ar=explode("\n", $str);  
              $str='';  
              foreach ($ar as $s) {  
                  $s=trim($s, "\r\n");  
                  if ($s) {  
                    $str .= $s;  
                    $str .= "\n";  
                  }  
              }  
              return $str;  
          }  
            
          print "\nVariante 1:" . effektiver_leerzeilen_entferner($test);  
          print "\nVariante 2:" . kaum_umstaendlicher_leerzeilen_entferner($test);  
          print "\nVariante 3:" . umstaendlicher_leerzeilen_entferner($test);  
          print "\n";  
          ?>  
          
          
          1. Oder willst Du was anderes?

            Wenn es auch "Leerzeilen" entfernen soll die Leerzeichen oder Tabs enthalten:

            <?php  
            $test='Hallo'  
            . " \r\n\r\n"  
            . " \n\n"  
            .  "\t\r\r"  
            .'  
              
            Welt!  
            ';  
              
            print leerzeilen_entferner($test)."\n";  
              
            function leerzeilen_entferner($str) {  
                $str = str_replace("\r", "\n", $str);  
                return  preg_replace("/\s*\n{2,}/", "\n", $str);  
            }  
            ?>  
            
            

            Erläuterung des Regex:

            /    :: start regex
            \s   :: repräsentiert Spaces (Leerzeichen, Tabs, Zeilenumbruch - letzteres ist bei dieser Aufgabe zu viel aber unschädlich)
            *    :: die kein-, ein-, oder mehrfach vorkommen, gefolgt von
            \n   :: Zeilumbruch (Newline)
            {2,} :: der zweimal oder öfter vorkommt.
            /    :: ende regex

            Eine Kurzreferenz.

            1. Hi,

              function leerzeilen_entferner($str) {
                  $str = str_replace("\r", "\n", $str);
                  return  preg_replace("/\s*\n{2,}/", "\n", $str);
              }

              Input: "bla                      \n\n".
              Output: "bla\n".
              Die nichtleere Zeile wurde verändert ...

              Braucht preg_replace kein g-Flag für generelles Ersetzen?

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
              1. Hallo Forum,

                vielen Dank für die vielen Antworten und Eure Hilfe!

                Vermutlich hatten viele von Euch recht. Der Fehler war, ich hatte vor der RegEx den tring mit trim(mysql_real_escape_string()) behandelt.

                Danach griff eigentlich gar nicht mehr von alledem.

                Gruß, Kai

                1. Tach!

                  Der Fehler war, ich hatte vor der RegEx den tring mit trim(mysql_real_escape_string()) behandelt.

                  Dann scheint mir, dass du an der falschen Stelle den Kontextwechsel zu behandeln versuchst. Diese Behandlung muss immer an der letztmöglichen Stelle passieren, also erst dann, wenn du die Daten ins SQL-Statement einfügst, oder ins HTML einfügst, oder in $andere_Umgebung einfügst. Alle vorhergehende Datenverarbeitung muss mit unbehandelten Rohdaten erfolgen.

                  dedlfix.

              2. Input: "bla                      \n\n".
                Output: "bla\n".
                Die nichtleere Zeile wurde verändert ...

                Ich vermute(!) mal, das dürfte im konkreten Anwendungsfall irrelevant sein.

                Braucht preg_replace kein g-Flag für generelles Ersetzen?

                Nein. PHP wirft dann eine Notiz: "PHP Warning:  preg_replace(): Unknown modifier 'g' in /../test.php on line 15" Ich finde das auch nicht so gut. Aus meiner Sicht sollten reguläre Ausdrücke in jeder Programmiersprache gleich funktionieren, was natürlich auch die Flags betrifft.

                Mir passiert das auch immer wieder, weil ich nicht nur PHP progge.

                Fred

                1. Hi,

                  Input: "bla                      \n\n".
                  Output: "bla\n".
                  Die nichtleere Zeile wurde verändert ...

                  Ich vermute(!) mal, das dürfte im konkreten Anwendungsfall irrelevant sein.

                  Mag sein. Ich wollte nur auf die Nebenwirkung hinweisen.

                  Braucht preg_replace kein g-Flag für generelles Ersetzen?

                  Nein. PHP wirft dann eine Notiz: "PHP Warning:  preg_replace(): Unknown modifier 'g' in /../test.php on line 15" Ich finde das auch nicht so gut. Aus meiner Sicht sollten reguläre Ausdrücke in jeder Programmiersprache gleich funktionieren, was natürlich auch die Flags betrifft.

                  Ok. Ich hab im Moment keine PHP-Umgebung griffbereit - sonst hätt ich selber ausprobiert.

                  cu,
                  Andreas

                  --
                  Warum nennt sich Andreas hier MudGuard?
                  O o ostern ...
                  Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      2. Lieber Kai,

        Ui. Diese regulären Ausdrücke :-)

        ja, genau: Ui. Ich wüsste wirklich nicht, was ich ohne sie machen sollte. Diese Dinger sind das Beste, was ich in Sachen Programmierung kennen gelernt habe.

        Sind aber auch extremst schwierig zu beherrschen ;-)

        Nein. Learning by doing, Übung macht den Meister, von nix kommt nix [...] - klar?

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  7. Hallo,

    $test = str_replace(chr(10).chr(10),'',$test);
    $test = str_replace(chr(13).chr(13),'',$test);
    $test = str_replace(chr(10).chr(13),'',$test);
    $test = str_replace(chr(13).chr(10),'',$test);
    $test = str_replace("\n\n", "", $test);

      
    "str\_replace — Ersetzt alle Vorkommen des Suchstrings durch einen anderen String"  
      
    Mir fällt auf, dass du Zweiergruppen ersetzt. Bei Unix / Linux besteht der Zeilenumbruch nur aus einem Zeichen chr(10). Hier habe ich drei Zeilen, die mittlere leer:  
      
    $test = "Zeile 1".chr(10).chr(10)."Zeile 3".chr(10);  
      
    Mit deinem Verfahren hast du nicht nur die leere entfernt, sondern auch aus den zwei restlichen eine gemacht:  
      
    "Zeile 1Zeile 3".chr(10);  
      
    Das gleiche Beispiel, aber die leere Zeile hat ein Blank:  
      
    $test = "Zeile 1".chr(10)." ".chr(10)."Zeile 3".chr(10);  
      
    Mit deinem Verfahren hast du sie nicht entfernt.  
      
    Rudi  
    
    
    1. Ein Schnellverfahren zur Anzeige von Leerzeichen und Zeilenumbrüchen per HTML ist dieses:

      $test = "Zeile 1".chr(10)." Zeile 2  ".chr(10).chr(10)." ".chr(10);

      echo "<pre>[<span style="background:#ff0>".$test."</span>]</pre>";

      Durch die Hintergrundfarbe siehst du auch Leerzeichen.

      Rudi