Grundlagenstudium: Textmanipulationen mit PHP

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

  • #46
    Hallo Griecherus.

    Danke für Deine Hinweise. Ich kenne mich ja noch nicht ganz so gut aus im Manual aus, wird aber mit jedem Mal besser.

    Ich habe jetzt mal folgendes versucht:

    PHP-Code:
    foreach (glob($path.'/'.$filename_pattern) as $filename) {
        
    $content file_get_contents($filename);
        
    $content manipulate($content);
        echo 
    $content;
        
    $Offen chmod ("$filename"0777); //Zeile 46
        
    $Offen fopen("$filename"'w+');
        
    fwrite($Offen"$content");
        
    fclose($Offen);

    Außer den üblichen Fehlermeldungen:

    Warning: file(*.php) [function.file]: failed to open stream: No such file or directory in /home/santodai/public_html/test/test38.php on line 20

    Warning: Invalid argument supplied for foreach() in /home/santodai/public_html/test/test38.php on line 22

    tauchen jetzt noch folgende auf:

    Warning: chmod() [function.chmod]: Operation not permitted in /home/santodai/public_html/test/test38.php on line 46 // Dateiattribut auf 777 eingestellt

    Warning: fopen(php/woerter.php) [function.fopen]: failed to open stream: Permission denied in /home/santodai/public_html/test/test38.php on line 47

    Warning: fwrite(): supplied argument is not a valid stream resource in /home/santodai/public_html/test/test38.php on line 48

    Warning: fclose(): supplied argument is not a valid stream resource in /home/santodai/public_html/test/test38.php on line 49

    Die ersten zwei sehen nach unerlaubten Arbeiten aus, die letzten zwei nach nicht einverstanden mit $filename.

    Aber die Konstruktion sieht doch ganz logisch aus. Wo ist der Fehler?

    Die echo Anweisung wird wie bisher ausgeführt, die gewünschten Veränderungen an der Datei dagegen nicht.

    Gruß
    Estrela
    Zuletzt geändert von Estrela; 18.06.2008, 21:38.
    Denk positiv.

    Kommentar


    • #47
      Die Antwort lautet mal wieder "Testausgaben"
      Lass dir mal in der Schleife $filename ausgeben und überprüfe die ausgegebenen Dateipfade auf ihre Richtigkeit.
      Wieso arbeitest du eigentlich zuerst mit file_get_contents und versuchst danach, dasselbe mit einer Reihe alternativer Funktionen zu erreichen?
      PHP-Code:
      echo '$path = ' $path '<br />' PHP_EOL;

      foreach (
      glob($path DIRECTORY_SEPARATOR '*.php') as $filename)
      {
          echo 
      '$filename = ' $filename '<br />' PHP_EOL;

          
      $contents file_get_contents($filename);
          
      $contents manipulate($contents);

          
      $result file_put_contents($filename$contents);

          if (
      $result === false)
          {
              die(
      'Error writing data to ' $filename);
          }

      Grüße
      Nieder mit der Camel Case-Konvention

      Kommentar


      • #48
        Hallo Griecherus.

        Wieso. file_get_contents wird doch in dieser Konstruktion gebraucht, um den Inhalt von $filename nach $content einzuladen, um ihn mit der Funktion manipulate zu modifizieren.

        Edit/ Und ich wußte nicht, ob das schon als geöffnete Datei gilt.
        Und chmod, weil es Schwierigkeiten beim öffnen gibt.

        Ich habe jetzt Deinen Code eingesetzt und das ist das Ergebnis:

        $path = php
        $filename = php/woerter.php

        Warning: file_put_contents(php/woerter.php) [function.file-put-contents]: failed to open stream: Permission denied in /home/santodai/public_html/test/test38.php on line 51
        Error writing data to php/woerter.php

        Die Angaben stimmen.

        Könnte es sein, das diese Operationen irgendwie auf meinem Server momentan Restriktionen unterliegen. Also eine Einstellung in der .htaccess, php.ini oder so?

        Gruß
        Estrela
        Zuletzt geändert von Estrela; 18.06.2008, 23:06.
        Denk positiv.

        Kommentar


        • #49
          Permission denied heißt auf deutsch Zugriff verweigert. Grob gesprochen hat es was mit den Ordner- und/oder Dateizugriffsrechten zu tun. Der Linuxbefehl chmod sagt dir was?
          Genauer gesprochen ist es so, dass der User, in dessen Kontext der Webserver läuft - meist wwwrun oder nobody - nicht in das Verzeichnis "php" und/oder die Datei "woerter.php" schreiben darf. Ihm fehlt das w-Recht. Das kannst du aus dem Script heraus auch nicht setzen, denn die PHP-Funktion chmod(), die das machen würde, läuft ja ebenfalls im Kontext des Webserver-Users und der kann sich natürlich nicht selbst mehr Rechte geben. Ergo musst du mal auf der Kommandozeile, z.B. via SSH chmod auf den Ordner und/oder die Datei ausführen. Wem du damit welche Rechte genau geben musst, überlasse ich dir mal selbst. Google weiß viel über chmod und die Linux-Dateirechte mit ihrer User-Group-Others-Struktur sind leicht zu verstehen.
          Bei deiner Recherche wirst du auch herausfinden, dass die Dateizugriffsrechte nichts mit .htaccess oder php.ini zu tun haben.

          Kommentar


          • #50
            Ergo musst du mal auf der Kommandozeile, z.B. via SSH chmod auf den Ordner und/oder die Datei ausführen.
            Entweder via Kommandokonsole oder mit jedem handelsüblichen FTP-Client
            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


            • #51
              Hallo zusammen.

              Danke für Deine ausführlichen Erläuterungen, onemorenerd.
              So habe ich mir das auch gedacht, das die Datei, die den Befehl enthält, selber die entsprechenden Rechte haben muß, um mit chmod entsprechende Rechte vergeben zu können.
              In meinem ersten Posting oben auf dieser Seite habe ich ja der Datei, die den Befehl enthält, das Dateiattribut 777 verliehen, und trotzdem kommen die Fehlermeldungen.
              Und zwar genau so, wie jahlives es empfohlen hat.

              Jetzt habe ich die Dateiattribute der zu verändernden Dateien ebenfalls auf 777 gesetzt und es funktioniert, juhuu.

              Aber genau das sollte doch eigentlich, wenn die Datei mit dem ausführenden Befehl selber 777 hat, von dem Befehl chmod erledigt werden, oder nicht?

              So, das wollte ich soweit erstmal mitteilen, jetzt noch ein wenig verdauen, und dann möchte ich nochmal das ein oder andere besprechen.

              Habe gerade noch gesehen, das das öffnende dl fehlt. Das werde ich noch vorher versuchen. Habe ja eine gute Vorlage.

              Danke soweit und

              Gruß
              Estrela
              Zuletzt geändert von Estrela; 19.06.2008, 16:07.
              Denk positiv.

              Kommentar


              • #52
                Hallo.

                Ich möchte hier noch mal ein kleines Resümee ziehen mit den Erkenntnissen und Fragen, die zu diesem Script gewonnen bzw noch offen sind.

                Wie ich gerade feststelle, ist es mit dieser Konstrukion mit meinem Verständnis garnicht so einfach, das erste dl einzufügen. Aber der Reihe nach.

                1. Die Variable $path wird nur benötigt, um sie in der Funktion zu verarbeiten.

                2. Das * in *.php fungiert als Platzhalter, wird aber mit Warnungen belegt.
                Ist jetzt filename_pattern frei wählbar oder bezieht sich das _pattern auf * ?

                3. In der ersten foreach Schleife: foreach($txt as $zeile)
                Ist das as ein Zuweisungsoperator für den String aus file ?

                4.
                PHP-Code:
                preg_replace('|<div class="texth1">(.+)</div>|U''<dt>$1</dt>'
                Markieren die | den zu suchenden Ausdruck.
                Ist das (.+ oder auch .*) ein Platzhalter für nicht zu beachtenden Text.
                Bezieht sich das $1 auf (.+) / (.*).

                5. Jetzt wird`s interessant. Habe ich noch nicht verstanden.
                PHP-Code:
                  if(preg_match('|</h1>|Ui'$str)){
                    
                $str .= "</dl>\n"
                </h1>, also der Abschluß der ersten Zeile, wird gesucht in $str, also der Zeile.
                Interpretation: Wenn gefunden </h1>, füge ein in $str </dl>
                Kann aber nicht stimmen, weil hinter </h1> kein dl kommt.

                6:
                PHP-Code:
                $str preg_replace('|<br\s*/?>|Ui'"\n</dl>\n<dl>"$str);
                    return 
                $str
                Hier werden jetzt die <br gesucht, um die schließenden und öffnenden Tags einzufügen.
                Was bedeutet dieser seltsame Ausdruck: <br\s*/?> ?

                7. In der letzten foreach Schleife wird glob verwendet, um *.php einsetzen zu können.
                DIRECTORY_SEPARATOR ist eine vordefinierte Konstante, hier = /

                8.
                PHP-Code:
                $contents file_get_contents($filename);
                    
                $contents manipulate($contents);
                    
                $result file_put_contents($filename$contents); 
                Hier werden die Daten aus der momentanen Datei einglesen, modifiziert und zurückgeschrieben.
                Seperates Öffnen und Schließen ist nicht nötig.

                9. die('Error writing data to ' . $filename);
                Die Anweisung, falls ($result === false), also die obrige Operation nicht ausgeführt werden konnte. Sehr hilfreich, wenn man erstmal die benötigten Dateiattribute herausfinden möchte. Bei mir reichte 646 für die zu verändernden Dateien und 746 für die Datei, die die o.g. Befehle enthält.

                Ich verstehe noch nicht, wie das letzte </dl> eingefügt wird, und darum weiß ich auch noch nicht, wie das erste <dl> einzufügen ist.

                Bitte um Korrektur der obigen Aussagen, falls sie falsch oder nur teilweise richtig sind.

                Gruß
                Estrela
                Denk positiv.

                Kommentar


                • #53
                  Ich habe dir 100% korrekten Code für ein File geliefert, auch wenn du dort Fehler anmeckerst, es sind keine Fehler drin. Deine Aussage, dass am Anfang kein <dl> gesetzt wird stimmt nicht, und das am Ende wird auch gesetzt!
                  Und genau diesen Code kannst du dann zwischen
                  PHP-Code:
                  $filesglob($pattern);
                  foreach (
                  $files as $file){
                      
                  // Hier der restliche Code 

                  Ausserdem soltest du endlich mal das Handbuch bemühen, um Funktionen wie preg_replace() oder preg_match() verstehen zu lernen. Wir lesen dir hier das Handbuch nicht vor!

                  Ausserdem gibts bei Kropff ein gutes Tutorial über reguläre Ausdrücke
                  Zuletzt geändert von H2O; 20.06.2008, 09:10.
                  Gruss
                  H2O

                  Kommentar


                  • #54
                    Hallo H2O.

                    Das reguläre Ausdrücke wohl ein Fall für sich sind, möchte ich mit folgendem Zitat aus Peter Kroppf´s Seite belegen:

                    " Leider muss ich gestehen, dass ich kein Profi in punkto reguläre Ausdrücke bin. Meiner Meinung nach sind sie das Schwierigste, was es in der Programmierung gibt. Erwartet hier also keine großartigen Erleuchtungen und Ergüsse, dazu reicht es bei mir einfach nicht.

                    Das Problem ist die Komplexität und der hohe Abstraktionsgrad bei regulären Ausdrücken. Viele sehen so aus, als ob der Programmierer sich während der Arbeit mal kurz auf der Tastatur abgestützt hat."

                    Also sehe ich diese Thematik eher als mittelfristiges Ziel an, die sich dann ja auch von Fall zu Fall vertiefen läßt.

                    Weiter möchte ich auf gar keinen Fall den Eindruck erwecken, ich würde den Code der Menschen, die mir eine wertvolle Hilfe gegeben haben, nach Abschluß der Aufgabenstellung mit unberechtigten Fehlern bekritteln oder herrabsetzen. Nur lassen eben die Ergebnisse nur eine Erkenntnis zu.

                    Der Code:

                    PHP-Code:
                    <?php

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

                    foreach(
                    $txt as $zeile){
                        echo 
                    manipulate($zeile);
                    }

                    function 
                    manipulate($str) {
                        
                    $str preg_replace('|<div class="texth1">(.+)</div>|U'
                                            
                    '<dt>$1</dt>'
                                            
                    preg_replace('|<div class="silber">(.*)</div>|U'
                                                            
                    '<dd>$1</dd>'
                                                            
                    $str
                                            
                    )
                        );
                        if(
                    preg_match('|</h1>|Ui'$str)){
                        
                    $str .= "</dl>\n";
                        }
                        
                    $str preg_replace('|<br\s*/?>|Ui'"\n</dl>\n<dl>"$str);
                        return 
                    $str;
                        
                    }
                    echo 
                    '$path = ' $path '<br />' PHP_EOL;

                    foreach (
                    glob($path DIRECTORY_SEPARATOR '*.php') as $filename)
                    {
                        echo 
                    '$filename = ' $filename '<br />' PHP_EOL;

                        
                    $contents file_get_contents($filename);
                        
                    $contents manipulate($contents);

                        
                    $result file_put_contents($filename$contents);

                        if (
                    $result === false)
                        {
                            die(
                    'Error writing data to ' $filename);
                        }
                    }
                    ?>
                    liefert mit diesem Text:

                    <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>

                    dieses Ergebnis:

                    <h1>1. Überschrift</h1>

                    <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>
                    <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>
                    </dl>

                    Wie zu sehen ist, ist das erste <dl> nicht vorhanden. Vielleicht haben Wir unterschiedliche Versionen?

                    Durch die Verwendung von preg_match sehe ich auch nicht in der Lage, dieses mit echo einzufügen.

                    Mein voriges Posting stellte den Versuch dar, meinen momentanen Stand der Erkenntnisse dieser Thematik aus dem Kopf wiederzugeben, in der Hoffnung, darüber auch mal von Mensch zu Mensch zu reden, nach dem Motto: Das kannst du so und so verstehen, oder das bedeutet das und das oder das macht man in der Regel so oder so. Entsprang einfach meinem Bedürfnis als Lernender, auch mal über Unklarheiten zu reden. Leider fand sich niemand, so das ich zu dem Schluß komme, das das vielleicht zu sehr aus der Perspektive des Rezipienten gedacht war.

                    Was ich wirklich nicht verstehe, warum dieser Ausdruck:
                    PHP-Code:
                    if(preg_match('|</h1>|Ui'$str)){
                        
                    $str .= "</dl>\n"
                    am Ende der Datei das schließende Tag reinschreibt, was es ja auch macht.
                    Auf Deutsch verstehe ich den Ausdruck so:
                    Wenn Du findest </h1> in $str, dann $str .= </dl>\n.
                    Über die Position sagt das aber noch nichts aus, es sei denn, der kleine Punkt bedeutet, das der Text anzufügen ist.

                    Gruß
                    Estrela
                    Denk positiv.

                    Kommentar


                    • #55
                      hi,

                      PHP-Code:
                          if(preg_match('|</h1>|Ui'$str)){
                          
                      $str .= "</dl>\n";
                          } 
                      PHP-Code:
                          if(preg_match('|</h1>|Ui'$str)){
                          
                      $str .= "<dl>\n";
                          } 
                      Sieht irgendwie nicht identisch aus...

                      btw: http://tut.php-quake.net/verkettungsoperator.html

                      Den Punkt hast du schon so oft kennen gelernt...

                      mfg
                      Zuletzt geändert von Blackgreetz; 20.06.2008, 21:52.

                      Kommentar


                      • #56
                        Hallo Blackgreetz.

                        Der Unterschied liegt im /.
                        In dieser Abfrage wird das schließende Tag am Ende des Dokumentes eingefügt.
                        Leider hällst Du Deine Aussage ziemlich knapp, so das nicht ersichtlich ist, was Du damit sagen willst, weil ja in dieser Abfrage das schließende Tag am Ende des Dokumentes eingefügt wird, das Problem ist aber das öffnende Tag <dl> am Anfang der Datei.

                        Ich habe schon versucht, an verschiedenen Stellen mit echo das <dl> einzufügen, habe aber keine passende Stelle gefunden.

                        Den Punkt als Verknüpfungsoperator habe ich in der Tat schon kennen gelernt, neu dazu hier, das das auch für ganze Dokumenteninhalte (warum auch nicht) gilt.

                        Nur, wenn der Punkt bestimmt, das das </dl> am Ende eingefügt wird, wie müßte die Abfrage formuliert sein, um sowohl das </dl> am Ende als auch das <dl> am Anfang der Datei einzufügen?

                        Gruß
                        Estrela
                        Denk positiv.

                        Kommentar


                        • #57
                          Hallo,

                          Guck dir bitte deinen Code an, und diesen:

                          http://php-resource.de/forum/showthr...119#post591119

                          Da hab ich den ohne / her... und da ist nach der 1. foreach sogar noch ein echo </dl>...

                          Ich könnte wetten, dass H2O diesen Code da genommen hat, statt deinen (woher er den auch kennen soll?) und da funktioniert es wohl...

                          mfg

                          Kommentar


                          • #58
                            Hallo Blackgreetz.

                            Danke für Deinen Hinweis.
                            Das mit dem / ist doch erstmal egal, Hauptsache die letzte Stelle im Dokument ist angesprochen. Wenn am Ende ein <dl> statt </dl> auftaucht, weiß ich ja, wo ich das ändern kann. Das wichtige ist doch, das das echo, das Du angesprochen hast, nicht mehr funktioniert. Als der Code von H2O kam, sagte ich doch noch, wie einfach das ist, in der ersten Zeile Code einzufügen. Da funktionierte es doch noch.
                            Daran kann man erkennen, das manche Aussagen nur in dem Kontext gültig sind, in dem sie gemacht wurden.

                            So doof bin ich nicht.
                            Ich habe den Code nochmal wie in der Beitragsfolge zusammengebaut und das ist das Ergebnis:
                            PHP-Code:
                            <?php

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

                            foreach(
                            $txt as $zeile){
                                echo 
                            manipulate($zeile);
                            }
                            echo 
                            "<dl>\n";

                            function 
                            manipulate($str) {
                                
                            $str preg_replace('|<div class="texth1">(.+)</div>|U'
                                                    
                            '<dt>$1</dt>'
                                                    
                            preg_replace('|<div class="silber">(.*)</div>|U'
                                                                    
                            '<dd>$1</dd>'
                                                                    
                            $str
                                                    
                            )
                                );
                                if(
                            preg_match('|</h1>|Ui'$str)){
                                    
                            $str .= "</dl>\n";
                                }
                                
                            $str preg_replace('|<br\s*/?>|Ui'"\n</dl>\n<dl>"$str);
                                return 
                            $str;
                            }


                            foreach (
                            glob($path DIRECTORY_SEPARATOR '*.php') as $filename)
                            {
                                echo 
                            '$filename = ' $filename '<br />' PHP_EOL;

                                
                            $contents file_get_contents($filename);
                                
                            $contents manipulate($contents);

                                
                            $result file_put_contents($filename$contents);

                                if (
                            $result === false)
                                {
                                    die(
                            'Error writing data to ' $filename);
                                }
                            }

                            ?>
                            Also ich habe jetzt vieles versucht und weiß nicht mehr weiter.
                            DER Code liefert kein <dl> am Anfang.
                            Könnte jemand, der das erste <dl> in der Datei hat, mal den Code veröffentlichen?

                            Gruß
                            Estrela
                            Denk positiv.

                            Kommentar


                            • #59
                              Dieses Script, was du uns gegeben hast...
                              ..ist das eine einzelne Datei, die du aufrufst, oder ist da noch mehr?
                              Bin jetzt doch recht faul mir noch 4 Seiten durchzulesen..

                              Wenn das der ganze Code der Datei ist, dann ist mir klar, warum ich ihn nicht verstehe...

                              mfg

                              Kommentar


                              • #60
                                Hallo Blackgreetz.

                                Dieses Script habe ich hier empfangen und oben wieder dargestellt.
                                Es ist die einzige Datei, die die Aufgebe erledigen soll.
                                Währe nett, wenn Du mich an Deinen Erkenntnisen teilhaben lassen würdest.

                                Gruß
                                Estrela
                                Denk positiv.

                                Kommentar

                                Lädt...
                                X