Grundlagenstudium: Textmanipulationen mit PHP

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

  • #16
    Hallo.

    Die Früchte dieses Tages sehen so aus, das ich nicht weiter als:

    <?php

    if ($handle = opendir('php/')) {
    while (false !== ($file = readdir($handle))) {
    echo "$file", "<br>";
    //array glob ( string $pattern [, int $flags ] )
    }
    closedir($handle);
    }
    ?>
    gekommen bin. Bis hierhin werden immerhin schon mal die Dateinamen untereinander angezeigt.

    @TobiaZ
    Ich verstehe nicht, warum Du den Befehl glob aufgeführt hast.
    Den kriege ich auch nicht eingebaut.
    Brauche ich, glaube ich, auch nicht, weil nur zu bearbeitende Dateien im Ordner liegen.
    Ich komme einfach nicht weiter.
    Kann mir nicht mal jemand weiterhelfen, damit ich am Ende des Tages wenigstens mal bis zu den offenen Dateien gekommen bin?

    Gruß
    Estrela
    Denk positiv.

    Kommentar


    • #17
      Hallo.

      Ich verstehe das einfach nicht.

      Wenn ich in diesem Beispiel:
      <?php

      if ($handle = opendir('php/')) {
      while (false !== ($file = readdir($handle))) {
      //echo "$file", "<br>";
      //array glob ( string $pattern [, int $flags ] )
      $mod = chmod ('$file', 0777);
      $IncText = file_get_contents ("$file");
      }
      closedir($handle);
      }
      ?>
      das echo einsetze, dann bekomme ich die Dateien angezeigt.
      Wenn ich aber mit chmod oder file_get_contens darauf zugreifen will, bekomme ich die Fehlermeldungen.
      Woran liegt denn das? Wenn mir mal jemand auf die Sprünge helfen könnte.

      Gruß
      Estrela
      Denk positiv.

      Kommentar


      • #18
        PHP-Code:
        <?php

        // Pfad zu den Dateien
        $path '.';
        // nur Dateien öffnen, die diesem Muster entsprechen
        $filename_pattern '*.txt';

        function 
        manipulate($str) {
            
        // Hier musst du noch deine Stringmanipulation einbauen.
            
        return $str;
        }

        foreach (
        glob($path.'/'.$filename_pattern) as $filename) {
            
        $content file_get_contents($filename);
            
        $content manipulate($content);
            echo 
        $content;
        }

        ?>
        Probiere das mal aus. Das sollte erstmal alle Dateien hintereinander ausgeben. Wenn es funktioniert, kannst du anfangen, die Funktion auszuarbeiten, damit sie die gewünschten Ersetzungen vornimmt.

        Übrigens wäre es sehr nett, wenn du auch die PHP-Tags dieses Forums benutzen würdest.

        Kommentar


        • #19
          Hallo onemorenerd.

          Mein Retter der Tages heißt onemorenerd. Danke Dir.

          Die Funktion fülle ich natürlich mit dem Vorschlag von H2O.

          PHP-Code:
          $zeile preg_replace('|<div class="texth1">(.+)</div>|U'
                                  
          '<dt>$1</dt>'
                                  
          preg_replace('|<div class="silber">(.*)</div>|U'
                                                  
          '<dd>$1</dd>'
                                                  
          $zeile
                                  
          )
                  ); 
          Die kleineren Fehler habe ich gefunden und ersetzt sowie die Anpassungen vorgenommen.
          Leider werden die Leerzeichen zwischen den Blöcken nicht mit ausgegeben.
          Worauf muß ich denn da achten?

          Die nötigen Anweisungen statt des echos werde ich mir morgen anschauen.
          Herzlichen Dank soweit.

          Gruß
          Estrela
          Denk positiv.

          Kommentar


          • #20
            Was für Leerzeichen denn? In HTML sind mehrfache Leerzeichen hintereinander sowieso nie zu sehen, das ist dir bewußt oder?

            Kommentar


            • #21
              Hallo onemorenerd.

              Sorry, ich meinte nicht Leerzeichen sondern Leerzeilen, das sind die Abstandszeilen zwischen den einzelnen Blöcken, wie im ersten Beitrag von mir zu sehen ist. Die meinte ich.

              Wenn ich den Code ohne Funktion laufen lasse, sind sie noch da. Also werden sie irgendwie rausgefiltert.

              Würde gerne morgen bzw später auf Deine foreach Schleife zu sprechen kommen, um sie zu verstehen.

              Sehr schön aufgebaut, soweit ich das beurteilen kann.

              Gruß
              Estrela
              Denk positiv.

              Kommentar


              • #22
                Hm, wenn du die Leerzeile zwischen dem einen <dd> und dem <dt> danach meinst, muss ich dich enttäuschen. Das geht so nicht. Du kannst nicht einfach lauter <dd>'s und <dt>'s ausgeben und erwarten, dass der Browser von selber weiß, wo er einen Abstand reinmachen soll. Das musst du ihm schon sagen. Dazu genügt z.B. ein class="space" für das <dd> und entsprechendes CSS.

                Da du nun aber wiederum nicht alle <dd>'s mit dieser Klasse versehen willst, musst du in der Funktion manipulate() eine Fallunterscheidung machen. Zunächst musst du herausfinden, ob der übergebene String einen Abstand/Lerrzeilen am Ende hat. Wenn dem so ist, soll preg_replace() eben nicht mit <dd> sondern mit <dd class="space"> ersetzen. So einfach isses.

                Allerdings frage ich mich, wie die Abstände bisher erzeugt wurden. Das solltest du dich auch fragen, denn das wird die Grundlage für die Fallunterscheidung sein.
                Zuletzt geändert von onemorenerd; 18.06.2008, 02:19.

                Kommentar


                • #23
                  Hallo onemorenerd.

                  Ich weiß jetzt nicht, ob Wir Uns richtig verstehen. Nochmal zum Text:

                  <dl>
                  <dt>Text portugiesisch</dt>
                  <dd> Deutsche Übersetzung</dd>
                  <dt>Text portugiesisch</dt>
                  <dd> Deutsche Übersetzung</dd>
                  <dt>Text portugiesisch</dt>
                  <dd> Deutsche Übersetzung</dd>
                  <dt>Text portugiesisch</dt>
                  <dd> Deutsche Übersetzung</dd>

                  <dt>Text portugiesisch</dt>
                  <dd> Deutsche Übersetzung</dd>
                  <dt>Text portugiesisch</dt>
                  <dd> Deutsche Übersetzung</dd>
                  <dt>Text portugiesisch</dt>
                  <dd> Deutsche Übersetzung</dd>
                  <dt>Text portugiesisch</dt>
                  <dd> Deutsche Übersetzung</dd>
                  </dl>

                  Den Text kannst Du Dir als einzelne Strophen eines Liedes vorstellen. Die Leerzeile zwischen den Strophen verschwindet beim Ausführen der Funktion. Da brauchte doch eigentlich nur noch eine Ersetzen-Definition nach dem Schema Leerzeile = Leerzeile eingefügt werden.
                  Wenn ich das soweit richtig verstehe.

                  Also ungefähr so:

                  PHP-Code:
                  $zeile preg_replace('|<div class="texth1">(.+)</div>|U'
                                          
                  '<dt>$1</dt>'
                                          
                  preg_replace('|<div class="silber">(.*)</div>|U'
                                                          
                  '<dd>$1</dd>'
                                           
                  preg_replace('|Leerzeile|U'
                                                          
                  'Leerzeile'
                  }

                                                          
                  $zeile
                                          
                  )
                          ); 
                  Wenn´s stimmt, müßte nur noch der richtige Ausdruck für Leerzeile gefunden werden.

                  Gruß
                  Estrela
                  Zuletzt geändert von Estrela; 18.06.2008, 09:26.
                  Denk positiv.

                  Kommentar


                  • #24
                    Wenn´s stimmt, müßte nur noch der richtige Ausdruck für Leerzeile gefunden werden.
                    http://regexp-evaluator.de/evaluator...1e29/#ergebnis
                    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                    Kommentar


                    • #25
                      Das Ziel ist ja gerade die DIVs gegen eine DL auszutauschen. Analog zu jahlives Vorschlag wäre das eine Lösung:
                      <dl>
                      <dt>...</dt><dd>...</dd>
                      <br>
                      <dt>...</dt><dd>...</dd>
                      </dl>

                      Ich bezweifle allerdings, dass das valides HTML ist. Davon abgesehen ist es einfach nicht schön. Abstände sollte man nicht mit BRs machen. Wenn man es schafft, ein BR einzufügen, kann es auch kein Problem sein, eine Class im vorherigen DD einzufügen.

                      Kommentar


                      • #26
                        Hallo zusammen.

                        Nochmal Sorry wegen unvollständigem Beispielcode. Tut mir echt leid. Das br /> muß mir irgend wie abhanden gekommen sein. Besonders, weil Du, onemorenerd, weiter an einem Problem gearbeitet hast, das eigentlich keines ist.

                        Jetzt verstehe ich auch die Frage, woher die Leerzeile kommen soll.

                        <div class="texth1">Text portugiesisch</div>
                        <div class="silber"> Deutsche Übersetzung</div><br />

                        <div class="texth1">Text portugiesisch</div>
                        <div class="silber"> Deutsche Übersetzung</div>

                        Das <br /> habe ich vergessen mitzuteilen.

                        Also handelt die Funktion es so, das alles nach dem zweiten Suchstring, also dem </div> nicht mehr dargestellt wird.

                        Wie kann man das verändern?
                        Habe mal so versucht, nach dem </div> noch Text zuzulassen:

                        PHP-Code:
                        function manipulate($str) {
                            
                        // Hier musst du noch deine Stringmanipulation einbauen.
                            
                        $str preg_replace('|<div class="texth1">(.+)</div>|U'
                                                
                        '<dt>$1</dt>'
                                                
                        preg_replace('|<div class="silber">(.*)</div>(.*)|U'
                                                                
                        '<dd>$1</dd>$2'
                                                                
                                                                
                        $str
                                                
                        )
                                                
                                                    
                                );
                            return 
                        $str;

                        Klappt leider nicht. Finde auch kein Beispiel, aus dem ich zu diesem Fall etwas lernen kann.

                        Den RegEx muß man auch erst mal studieren. Geht mir jetzt aber zu sehr ins Detail. Möchte erst mal ein Niveau des allgemeinen Verstehens erreichen, bevor ich dann in die Einzelheiten eintauchen kann und ich wollte ja auch noch die foreach Schleife durchsprechen.

                        Gruß
                        Zuletzt geändert von Estrela; 18.06.2008, 10:51.
                        Denk positiv.

                        Kommentar


                        • #27
                          erweitere die Funktion mit dem REGEX von jahlives
                          PHP-Code:
                          function manipulate($str) {
                              if (
                          preg_match('&^(\r\n|\r|\n)$&Um'$str){
                                  return 
                          '<br />';
                              }
                              
                          $str preg_replace('|<div class="texth1">(.+)</div>|U'
                                                  
                          '<dt>$1</dt>'
                                                  
                          preg_replace('|<div class="silber">(.*)</div>(.*)|U'
                                                                  
                          '<dd>$1</dd>'
                                                                  
                          $str
                                                  
                          )
                                                  
                                                      
                                  );
                              return 
                          $str;

                          Gruss
                          H2O

                          Kommentar


                          • #28
                            Hallo H2O.

                            So lerne ich auch mal Klammern zählen. Habe die fehlende also gefunden.

                            PHP-Code:
                            function manipulate($str) {
                                if (
                            preg_match('&^(\r\n|\r|\n\)$&Um'$str)){
                                    return 
                            '<br />';
                                } 
                            Funktioniert leider nicht. Liefert das gleiche Ergebnis wie ohne preg_match.
                            Gebe auch nochmal zu bedenken, das das <br /> ja im originalen Text überall an den richtigen Stellen eingefügt ist.
                            Hier in dieser Klammer "('&^(\r\n|\r|\n\)" kann ich den String nicht entdecken. Es geht also nicht um eine nötige Transformation von \n usw in <br />, sondern darum, das das <br /> am Ende eines Textblocks nach dem </div> erhalten bleibt, das momentan ja durch das preg_replace keine Berücksichtigung mehr findet.
                            <div class="silber"> Deutsche Übersetzung</div><br />
                            Ich habe das ja so
                            PHP-Code:
                            preg_replace('|<div class="silber">(.*)</div>(.*)|U'
                                                                    
                            '<dd>$1</dd>$2'
                            schon mal probiert, klappte aber nicht.

                            Kann nicht die Definition des zu suchenden Ausdrucks in preg_replace so gestaltet werden, das, falls hinter dem </div> noch code kommt (ist am Ende eines jeden Blocks der Fall, außer dem letzten Block in der Datei), das dieser also weiterhin angezeigt wird.
                            Dann währen die Blöcke wieder durch eine Leerzeile getrennt, wie es ja sein soll.

                            Gruß
                            Estrela
                            Zuletzt geändert von Estrela; 18.06.2008, 11:55.
                            Denk positiv.

                            Kommentar


                            • #29
                              Jetzt möchte ich wirklich mal sehen, wie die Originaldaten aussehen, scheinbar hast du nicht alles gezeigt, sondern nur was der Browser anzeigt. Wenn natürlich noch <br />'s drin sind, sieht das völlig anders aus.
                              Einfach als Beispiel:
                              PHP-Code:
                              <?php
                              $txt 
                              = array(
                              '<h1>1. &Uuml;berschrift</h1><br />',
                              '<br />',
                              '<div class="texth1">Text portugiesisch 1</div><br />',
                              '<div class="silber"> Deutsche &Uuml;bersetzung 2</div><br />',
                              '<div class="texth1">Text portugiesisch 2</div><br />',
                              '<div class="silber"> Deutsche &Uuml;bersetzung 2</div><br />',
                              '<div class="texth1">Text portugiesisch 3</div><br />',
                              '<div class="silber"> Deutsche &Uuml;bersetzung 3</div><br />',
                              '<div class="texth1">Text portugiesisch 4</div><br />',
                              '<div class="silber"> Deutsche &Uuml;bersetzung 4</div><br />',
                              '<br />',
                              '<div class="texth1">Text portugiesisch 5</div><br />',
                              '<div class="silber"> Deutsche &Uuml;bersetzung 5</div><br />',
                              '<div class="texth1">Text portugiesisch 6</div><br />',
                              '<div class="silber"> Deutsche &Uuml;bersetzung 6</div><br />',
                              '<div class="texth1">Text portugiesisch 7</div><br />',
                              '<div class="silber"> Deutsche &Uuml;bersetzung 7</div><br />',
                              '<div class="texth1">Text portugiesisch 8</div><br />',
                              '<div class="silber"> Deutsche &Uuml;bersetzung 8</div><br />',
                              '<br />'
                              );


                              foreach(
                              $txt as $zeile){
                                  echo 
                              manipulate($zeile) . "\n";
                              }

                              function 
                              manipulate($str) {
                                  
                              $str preg_replace('|<div class="texth1">(.+)</div><br />|U'
                                                      
                              '<dt>$1</dt>'
                                                      
                              preg_replace('|<div class="silber">(.*)</div><br />(.*)|U'
                                                                      
                              '<dd>$1</dd>'
                                                                      
                              $str
                                                      
                              )
                                      );
                                  return 
                              $str;
                              }
                              ?>
                              ergibt (Quellcode):
                              Code:
                              <h1>1. &Uuml;berschrift</h1><br />
                              <br />
                              <dt>Text portugiesisch 1</dt>
                              <dd> Deutsche &Uuml;bersetzung 2</dd>
                              <dt>Text portugiesisch 2</dt>
                              <dd> Deutsche &Uuml;bersetzung 2</dd>
                              <dt>Text portugiesisch 3</dt>
                              <dd> Deutsche &Uuml;bersetzung 3</dd>
                              <dt>Text portugiesisch 4</dt>
                              <dd> Deutsche &Uuml;bersetzung 4</dd>
                              <br />
                              <dt>Text portugiesisch 5</dt>
                              <dd> Deutsche &Uuml;bersetzung 5</dd>
                              <dt>Text portugiesisch 6</dt>
                              <dd> Deutsche &Uuml;bersetzung 6</dd>
                              <dt>Text portugiesisch 7</dt>
                              <dd> Deutsche &Uuml;bersetzung 7</dd>
                              <dt>Text portugiesisch 8</dt>
                              <dd> Deutsche &Uuml;bersetzung 8</dd>
                              <br />
                              was ja fast (ausser den fehlenden <dl>'s) das wäre, was du willst
                              Gruss
                              H2O

                              Kommentar


                              • #30
                                Hallo H2O.

                                OK, nochmal zum Text wie im Editor:

                                <h1>1. Überschrift</h1>

                                <div class="texth1">Text portugiesisch</div>
                                <div class="silber"> Deutsche Übersetzung</div>
                                <div class="texth1">Text portugiesisch</div>
                                <div class="silber"> Deutsche Übersetzung</div>
                                <div class="texth1">Text portugiesisch</div>
                                <div class="silber"> Deutsche Übersetzung</div>
                                <div class="texth1">Text portugiesisch</div>
                                <div class="silber"> Deutsche Übersetzung</div><br />

                                <div class="texth1">Text portugiesisch</div>
                                <div class="silber"> Deutsche Übersetzung</div>
                                <div class="texth1">Text portugiesisch</div>
                                <div class="silber"> Deutsche Übersetzung</div>
                                <div class="texth1">Text portugiesisch</div>
                                <div class="silber"> Deutsche Übersetzung</div>
                                <div class="texth1">Text portugiesisch</div>
                                <div class="silber"> Deutsche Übersetzung</div>

                                Die Leerzeile im Editor habe ich wegen der Übersichtlichkeit im Quellcode eingefügt.
                                Die Trennung der Strophen im Browser erfolgt aber durch das letzte <br /> der letzten Zeile eines jeden Blocks.
                                Also kann nicht einfach der zweite Suchbegriff erweitert werden, weil das ja kein Zustand ist, der zu verändern ist, ganz im Gegenteil, jedes <br /> soll stehen bleiben, weil es an der richtigen Stelle steht, am Ende eines jeden Blocks.
                                So wie ich das verstehe, währe die richtige Lösung, die entsprechende preg_replace Anweisung so zu gestallten, das nach dem zweiten zu suchenden Ausdruck (</div>) noch etwas stehen kann, das auch da bleiben soll, wie es ja beim ersten Ausdruck (<div class="silber">) mit der Kennzeichnung ((.*)) auch geschieht.
                                Und genau das habe ich ja hier versucht:
                                PHP-Code:
                                preg_replace('|<div class="silber">(.*)</div>(.*)|U'
                                                                        
                                '<dd>$1</dd>$2'
                                indem ich hinter den zweiten Ausdruck (</div>) noch ein ((.*)) eingefügt habe und diesen String mit ($2) im zweiten Teil der Anweisung ansprechen wollte.
                                Wie gesagt, funktioniert so nicht.

                                Gruß
                                Estrela
                                Denk positiv.

                                Kommentar

                                Lädt...
                                X