Ankündigung

Einklappen
Keine Ankündigung bisher.

str_replace erkennt erstes Zeichen einer Zeile nicht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • str_replace erkennt erstes Zeichen einer Zeile nicht

    Hallo Forum !
    Mit folgenden -an sich funktionierenden- kleinen Skript lese ich eine Datei ein und ersetze in ihr vorkommende Strings.

    Code:
     $handle = fopen ($file, "r");
           while (!feof($handle)) {
                  $buffer = fgets($handle, 4096);
                  if (strpos($buffer,$alt))
                  {
                       $buffer = str_replace("$alt","$neu","$buffer"); 
                  }
                       echo (htmlspecialchars ($buffer));
                       fputs($handle2,$buffer);
                  echo "
    ";
                  } // end while
    echo "Es wurden $i Zeilen geändert";
    fclose ($handle);
    fclose ($handle2);
    Soweit funktioniert es auch, nur den jeweils ersten String einer Zeile ersetzt / erkennt er nicht.
    Ist die Beispieldatei zB
    Code:
    Dies ist ein Text.
    Er geht über mehrere Zeilen.
    Er dient nur zum testen.
    so wird "Er" nicht ersetzt, "mehrere" dagegen schon.


  • #2
    Groß-/Kleinschreibung?

    Du ersetzt nicht in einer Schleife, also wird pro Zeile nur ein Wort ersetzt.

    Kommentar


    • #3
      Hallo Saraneus,

      ich habe es gerade nochmals getestet:
      a) Das Skript ersetzt auch mehrere Wörter pro Zeile
      b) Auf Klein-/Großschreibung wird geachtet.

      Es ist wirklich immer nur das erste Wort pro Zeile betroffen, das sich nicht ersetzen läßt.

      Kommentar


      • #4
        Zitat von Fragenfrager
        Das Skript ersetzt auch mehrere Wörter pro Zeile
        Aber nur, wenn diese Wörter gleich sind. Verschiedene Wörter in derselben Zeile werden deinem Code nach nicht ersetzt.

        Zeig nochmal den kompletten, relevanten Code, aber bitte in code- statt in php-Tags setzen.

        Kommentar


        • #5
          Zitat von Saraneus
          Aber nur, wenn diese Wörter gleich sind. Verschiedene Wörter in derselben Zeile werden deinem Code nach nicht ersetzt.
          Ja das stimmt, ist an dieser Stelle aber auch noch nicht notwendig. Aber danke für den Hinweis.
          Hier nochmal der komplette Code:

          Code:
          <?php
          function datei_ausgeben($file,$alt,$neu)
          {
                 $i=0;
                 $newfile = $file."_neu";
                 $handle2 = fopen ($newfile, "w");
                 $handle = fopen ($file, "r");
                 while (!feof($handle)) {
                        $buffer = fgets($handle, 4096);
                        if (strpos($buffer,$alt))
                        {
                             $buffer = str_replace("$alt","$neu","$buffer");                      // ersetzt die Strings und gibt sie aus.
                             $i++;
                        }
                             echo (htmlspecialchars ($buffer));
                             fputs($handle2,$buffer);
                        echo "
          ";
                        } // end while
          echo "Es wurden $i Zeilen geändert";
          fclose ($handle);
          fclose ($handle2);
          } //end function
          
           datei_ausgeben($HTTP_POST_VARS["datei"],$HTTP_POST_VARS["altstring"],$HTTP_POST_VARS["neustring"]);
          
          ?>

          Kommentar


          • #6
            Was steht in $alt und $neu? print_r() bitte am Anfang der Funktion. Außerdem bitte die einzelnen Zeilen VOR und NACH dem Replace anzeigen.

            Kommentar


            • #7
              In $alt ist der zu ersetzende String (wird per Formular eingegeben und per POST übergeben ), der Wert ist "Er"
              In $neu ist der neue String (wird per Formular eingegeben und per POST übergeben ), der Wert ist "Ich".

              Der Text vor dem replace ist
              Code:
              Dies ist ein Text. 
              Er geht über mehrere Zeilen. 
              Er dient nur zum testen.
              und ist identisch mit dem Text nach dem replace.

              Ändere ich $alt zB in "Text", so ist das Ergebnis wunschgemäß
              Code:
              Dies ist ein Ich. 
              Er geht über mehrere Zeilen. 
              Er dient nur zum testen.
              Wie gesagt, replace funktioniert scheinbar nur nicht, wenn ich das erste Wort eine Zeile (hier: Dies oder Er) ersetzen will.

              Kommentar


              • #8
                Code:
                function replaceFileContent($path, $alt, $neu)
                {
                    $fp = fopen($path, "r");
                    if($fp === false)
                        return "";
                    while(!feof($fp)) {
                        $buf = fgets($fp, 4096);
                        $buf = str_replace($alt, $neu, $buf);
                    }
                    fclose($fp);
                    
                    return $buf;
                }
                
                echo replaceFileContent($deinPfad, "Er", "Ich");
                Probier das mal!

                Kommentar


                • #9
                  Ja, das klappt.

                  Vielen Dank !

                  Kommentar


                  • #10
                    Ja, und der Fehler interessiert dich nicht?

                    Guckst du diese Zeile in deinem Code:
                    Code:
                    if (strpos($buffer,$alt))
                    Da "Er" an Position 0 in der Zeile steht, gibt strpos() 0 zurück. Und ein If-Statement erkennt das als false, weshalb der Block nicht ausgeführt wird. strpos() brauchst du aber in diesem Fall nicht prüfen, denn str_replace ersetzt sowieso nur die Vorkommen

                    Kommentar


                    • #11
                      Wenn du dann doch mal mit strpos() überprüfen möchtest und die Zeichenkette auch an 1. Position vorkommen darf, musst du einen typensicheren Vergleich vornehmen:
                      PHP-Code:
                      if(strpos($haystack$needle) !== false

                      Kommentar


                      • #12
                        strpos() wollte ich prüfen, um mittels eines Counters die Anzahl der geänderten Zeilen zu ermitteln. Aber danke für die Info. Da kann ich ja lange grübeln

                        Kommentar

                        Lädt...
                        X