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

  • Fragenfrager
    hat ein Thema erstellt str_replace erkennt erstes Zeichen einer Zeile nicht.

    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.

  • Fragenfrager
    antwortet
    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

    Einen Kommentar schreiben:


  • xabbuh
    antwortet
    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

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


  • Fragenfrager
    antwortet
    Ja, das klappt.

    Vielen Dank !

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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!

    Einen Kommentar schreiben:


  • Fragenfrager
    antwortet
    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.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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.

    Einen Kommentar schreiben:


  • Fragenfrager
    antwortet
    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"]);
    
    ?>

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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.

    Einen Kommentar schreiben:


  • Fragenfrager
    antwortet
    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.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Groß-/Kleinschreibung?

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

    Einen Kommentar schreiben:

Lädt...
X