Grundlagen PHP: Sonderzeichen konvertieren

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

  • #31
    In meiner Schleife mache ich überhaupt nichts mit Dateien.
    Vor der Schleife hole ich die gesamte Eingabedatei mit file() in ein Array.
    Über dieses Array iteriert meine Schleife, ändert jeweils eine Zeile und schreibt die Änderung zurück in das Array.
    Nach der Schleife schreibe ich das gesamte Array in einem Rutsch mit file_put_contents() in eine Datei.

    Hier nochmal der Code mit Kommentaren:
    PHP-Code:
    // Eingabedatei in Array laden
    $text file('Datei A');

    // Ersetzungstabelle $tabelle = array(...) laden, s.o.
    include('Datei mit Tabellendefinition');

    // für jede Zeile der Eingabedatei die Schleife durchlaufen
    foreach ($text as $nr => $zeile) {
        
    // Zeile am Trennzeichen zerlegen, in Hilfsarray speichern
        
    $teile explode('#'$zeile);
        
    // zwei Ersetzungen vornehmen, in Hilfsvariablen speichern
        
    $ersetzt01 str_replace($tabelle[0], $tabelle[1], $teile[0]);
        
    $ersetzt02 str_replace($tabelle[0], $tabelle[2|, $teile[0]);
        
    // neue Zeile zusammensetzen, an Position der alten im Array speichern
        
    $text[$nr] = $zeile $ersetzt01 '.php">' $ersetzt02 '</a>';
    }

    // gesamtes Array in eine Datei schreiben
    file_put_contents('Datei B'$text); 

    Kommentar


    • #32
      Hallo onemorenerd.

      Aha, mein Fehler bei der Anwendung des file_put_contens war gewesen, das ich den Zusammenbau nicht in einer Hilfsvariablen vollzogen habe, sondern im Befehl selber, was offensichtlich nicht möglich ist. Danke für die Aufklärung.

      Jetzt stellt sich mir die Frage nach dem Unterschied von
      foreach ($ArbZ as $nr => $zeile) und
      foreach ($ArbZ as $zeile), also wann wende ich welche Version an?
      Ich habe versucht, das für mich zu definieren, aber ich kann das noch nicht fassen.
      Weil doch sowieso jede Zeile durchlaufen und bearbeitet wird, warum ist es da für mich von Wert, die einzelne Zeilennummer ansprechen zu können, obwohl genau dieses Verfahren zur Lösung des Teilproblems führte.
      Also, wann ist es sinnvoll, mit ($ArbZ as $zeile) zu arbeiten und wann mit ($ArbZ as $nr => $zeile). Kannst Du den Unterschied mit ein paar Worten einleuchtend darstellen?
      Liegt es daran, das ohne ($ArbZ as $nr => $zeile) die Zeile keinen "Namen" hat und darum solche Operationen:
      $TeilZeilRepl[$nr] = str_replace($chars['browser'], $chars['replace'], $TeilZeil[0]);
      nicht möglich sind?

      Der Code der Schleife jetzt:

      PHP-Code:
      foreach ($ArbZ as $nr => $zeile) { 
                                      
      $TeilZeil explode("#"$zeile);
                                      
      $TeilZeil[0] = str_replace(' ','',$TeilZeil[0]);
                                      
      $TeilZeilRepl[$nr] = str_replace($chars['browser'], $chars['replace'], $TeilZeil[0]);
                                      
      $TeilZeilRepl[$nr] = ($TeilZeilRepl[$nr]."\n");
                                      echo 
      $TeilZeilRepl[$nr].'<br  />';
                                      
      $TeilZeilSour str_replace($chars['browser'], $chars['source'], $TeilZeil[0]);
                                      
      $ZeilZusam[$nr] = $TeilZeil[0].'#'.$TeilZeil[1].$TeilZeilRepl[$nr].'.php">'.$TeilZeilSour.'</a>'."\n";
                                      echo 
      $ZeilZusam[$nr].'<br  />';
                                }
      file_put_contents ($DatNam $TeilZeilRepl);
      file_put_contents ($VorbNeu $ZeilZusam);

      echo 
      'Fertig'
      Jetzt habe ich ja darauf verzichtet, die $TeilZeil[1] von Leerzeichen zu befreien, um das a href zu erhalten, weil ja nicht das gewünschte Ergebnis eintrat, nähmlich ein zusammenhängender Link in $VorbNeu und habe jetzt festgestellt, das die zusammengebaute Zeile mit dem Link jetzt in vier Zeilen in der Datei vorliegt und mir kein Prüfverfahren einfällt, um herauszufinden, wie ich es ändern kann.
      Wie gehe ich richtig vor, um festzustellen, was zu ändern ist, damit die zusammengebaute Zeile auch zusammenhängend, also in einer Zeile, abgespeichert wird?
      Ich habe doch den Verbindungsoperator . eingesetzt, den einzigen, den ich kenne.

      Danke für die Kommentare.

      Gruß
      Estrela
      Denk positiv.

      Kommentar


      • #33
        Also, wann ist es sinnvoll, mit ($ArbZ as $zeile) zu arbeiten und wann mit ($ArbZ as $nr => $zeile). Kannst Du den Unterschied mit ein paar Worten einleuchtend darstellen?
        Liegt es daran, das ohne ($ArbZ as $nr => $zeile) die Zeile keinen "Namen" hat und darum solche Operationen:
        $TeilZeilRepl[$nr] = str_replace($chars['browser'], $chars['replace'], $TeilZeil[0]);
        nicht möglich sind?
        Genau.

        Die zwei Varianten foreach($array as $element) und foreach($array as $key => $element) iterieren beide über jedes Arrayelement.

        Der einzige Unterschied besteht darin, dass bei der ersten Variante $key nicht existiert. Diese Variable braucht man, wenn man $array an der aktuellen Position verändern möchte - $array[$key] = 'foo'. ($element = 'foo' bringt natürlich nichts, da $element nach der Schleife nicht mehr existiert.)

        Würde es dieses foreach mit dem Key nicht geben, müsste man die aktuelle Position mit array_search($element, $array) bestimmen, was deutlich langsamer wäre.

        Wie gehe ich richtig vor, um festzustellen, was zu ändern ist, damit die zusammengebaute Zeile auch zusammenhängend, also in einer Zeile, abgespeichert wird?
        Entferne den Zeilenumbruch am Ende der Zeile, bevor du weitere Zeichen anhängst. Entweder machst du das in der Schleife mit trim() oder ... na schau dir mal die Signatur von file() an.

        Kommentar


        • #34
          Hallo onemorenerd.

          Da sieht man mal wieder, wie man sich als Anfänger verlaufen kann.
          Ich habe ja selber, um die Dateinamen einzeln in einer Zeile stehen zu haben, ein \n angefügt.
          Dieses habe ich jetzt korrigiert, indem ich dem Kind einen anderen Namen gegeben habe. Der trim Befehl in Verbindung mit der Hilfsvariablen brachte das gewünschte Ergebnis.
          PHP-Code:
          foreach ($ArbZ as $nr => $zeile) { 
                                          
          $TeilZeil explode("#"$zeile);
                                          
          $TeilZeil[0] = str_replace(' ','',$TeilZeil[0]);
                                          
          $TeilZeilRepl[$nr] = str_replace($chars['browser'], $chars['replace'], $TeilZeil[0]);
                                          
          $TeilZeilRepl2[$nr] = ($TeilZeilRepl[$nr]."\n");
                                          echo 
          $TeilZeilRepl[$nr].'<br  />';
                                          
          $TeilZeilSour str_replace($chars['browser'], $chars['source'], $TeilZeil[0]);
                                          
          $TeilZeil1 $TeilZeil[1];
                                          
          $TeilZeil1 trim($TeilZeil1);
                                          
          $ZeilZusam[$nr] = $TeilZeil[0].'#'.$TeilZeil1.$TeilZeilRepl[$nr].'.php">'.$TeilZeilSour.'</a>'."\n";
                                          echo 
          $ZeilZusam[$nr].'<br  />';
                                    }
          file_put_contents ($DatNam $TeilZeilRepl2);
          file_put_contents ($VorbNeu $ZeilZusam); 
          Jetzt hat der Realitätstest gezeigt, das ich auch zusammengesetzte Begriffe vor dem # stehen habe und das erste und letzte Zeichen ist ein leeres. Ich kann also nicht die Leerzeichen einfach löschen, weil dann die einzelnen Wörter zusammenklatschen. Also " Wort1 wort2 Wort3 "#pfad/. Jetzt kann ich ja mit str_replace die Leerzeichen mit _ ersetzen und ebenfalls das " #" mit "#", aber wie lösche ich das erste Leerzeichen, um einen gültigen Dateinamen zu erzeugen, oder wie würdest Du die Aufgabe lösen?
          Unter den Array-Befehlen habe ich nichts passendes entdeckt, weil dort nur die Manipulation zwischen den Array-Teilen, nicht aber der Inhalte behandelt wird, also muß ich vorher ansetzen.
          Unter den file-Befehlen habe ich auch nichts passend scheinendes gefunden.

          Gruß
          Estrela
          Denk positiv.

          Kommentar


          • #35
            die antwort hast du dir doch schon selbst gegeben!

            und mitlerweile hast du alle befehle die du brauchst.
            PseudoCode
            PHP-Code:
            //leerzeichen davor und danach löschen
            $var " hallo hier drüben ";
            $var=trim($var);
            //dazwischen leerzeichen ersetzen mit _
            $var=str_replace(' ','_',$var); 
            schau was bei trim() steht.

            alternative ... Explode
            Bitte Beachten.
            Foren-Regeln
            Danke

            Kommentar


            • #36
              Hallo zusammen.
              Wollte nur mal kurz ´ne Mitteilung machen, warum mitten in der Aufgabe ein Break entstand.
              Weil vor ca. 14 Tagen durch eine wahrscheinlich durch einen Blitz induzierte Überspannung einige Komponenten die Funktion einstellten und jetzt die Lieferfristen doch länger sind, als erwartet, setzte ich diese kurze Meldung ab. Bin sofort wieder am Start, wenn es mir möglich ist.
              Danke für das Verständnis und
              mit freundlichem Gruß
              Estrela
              Denk positiv.

              Kommentar


              • #37
                Hallo zusammen.

                Sorry, hat ja alles viel länger gedauert als gedacht.
                Dafür habe ich jetzt die Ausgabe mit Einsatz von Hilfsvariablen fertig bekommen.

                PHP-Code:
                foreach ($ArbZ as $nr => $zeile) { 
                                                
                $TeilZeil explode("#"$zeile);
                                                
                $TeilZeil0 $TeilZeil[0];//" wort wort "#
                                                
                $TeilZeil01 trim($TeilZeil0);// "wort wort"#
                                                
                $TeilZeil1 str_replace (' ','_',$TeilZeil01);// "wort_wort"#
                                                
                $TeilZeil2 $TeilZeil[1];
                                                
                $TeilZeil2 trim ($TeilZeil2);
                                                
                $TeilZeilRepl[$nr] = str_replace($chars['browser'], $chars['replace'], $TeilZeil01);
                                                
                $TeilZeilRepl2[$nr] = ($TeilZeilRepl[$nr]."\n");
                                                
                $TeilZeilRepl3[$nr] = str_replace($chars['browser'], $chars['replace'], $TeilZeil1);
                                                echo 
                $TeilZeilRepl[$nr].'<br  />';
                                                
                $TeilZeilSour str_replace($chars['browser'], $chars['source'], $TeilZeil0);
                                                
                $ZeilZusam[$nr] = $TeilZeil0.'#'.$TeilZeil2.$TeilZeilRepl3[$nr].'.php">'.$TeilZeilSour.'</a>'."\n";
                                                echo 
                $ZeilZusam[$nr].'<br  />';
                                          } 
                Hiermit habe ich genau die Ausgabe, die ich brauche.
                Dank an alle, die hier fachkundig, geduldig und konstruktiv geholfen haben.

                Gruß
                Estrela
                Denk positiv.

                Kommentar

                Lädt...
                X