Grundlagenstudium: Textmanipulationen mit PHP

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

  • #31
    Langsam weiss ich echt nicht mehr, was du willst, die Teile, die nicht Teil des Regex sind, werden doch unverändert ausgegeben, da brauchst du dich gar nicht drum zu kümmern. Also genügt für deinen Text
    PHP-Code:
    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
                            
    )
        );
        return 
    $str;

    Wenn nicht, dann hast du einen anderen Text als der gezeigte
    Gruss
    H2O

    Kommentar


    • #32
      Hallo H2O.

      Schau Dir doch mal folgende Seite mit dem Ergebnis der Operation an:
      http://www.santodaimeportal.de/test/test38.php

      Hier siehst Du den Quellcode:
      http://www.santodaimeportal.de/test/test38a.php

      Es fehlt die Leerzeile, also das <br /> nach dem zweiten Suchstring.

      Gruß
      Estrela
      Denk positiv.

      Kommentar


      • #33
        Ähm, ich hatte es schon erwähnt, aber scheinbar wurde es nicht wahrgenommen. Jetzt habe ich es sogar schriftlich vom W3C Validator:
        Angesetzt auf diesen HTML-Code
        Code:
        <dl>
            <dt>foo</dt>
            <dd>bar</dd>
            <br />
            <dt>foo</dt>
            <dd>bar</dd>
        </dl>
        schreit er mir in knalligem Rot entgegen
        document type does not allow element "br" here; missing one of "dt", "dd" start-tag.
        Was ihr da versucht hinzubekommen ist also absolut sinnlos. Entweder bleibt ihr bei DIVs und kleckert BRs dazwischen (dann wäre das Problem erledigt, denn das ist ja der Ist-Zustand) oder ihr bemüht euch weiterhin um eine Erstetzung der DIVs durch eine DL, dann aber bitteschön ohne BRs wo sie nicht hingehören.

        EDIT:
        Bzgl. des Links: Die BRs sind da, aber der Browser mag sie an dieser Stelle eben nicht und rendert sie nicht. q.e.d.
        Übrigens vermisse ich da auch DL-Tags.

        Zuletzt geändert von onemorenerd; 18.06.2008, 13:53.

        Kommentar


        • #34
          Hallo onemorenerd.

          Ach so, in einer dl sind keine <br /> erlaubt.
          Jetzt, wo Du es sagst, hört sich das ja auch logisch an.

          Dann kann ich nicht mit dl arbeiten, weil ja dringend die zugrunde liegende Struktur erhalten bleiben muß.

          Dann werde ich wohl besser mit <p> oder <span> arbeiten müssen.

          Danke für Deine Aufmerksamkeit.

          Gruß
          Estrela

          Edit: Oder aus jedem Block eine eigene dl.
          Zuletzt geändert von Estrela; 18.06.2008, 14:00.
          Denk positiv.

          Kommentar


          • #35
            Es fehlt die Leerzeile, also das <br /> nach dem zweiten Suchstring.
            Eine Leerzeile in HTML besteht aber normalerweise aus <br /><br />
            Es ist nicht valide aber funzt
            Code:
            <dl>
                <dt>foo</dt>
                <dd>bar</dd>
                <br />
                <br />
                <dt>foo</dt>
                <dd>bar</dd>
            </dl>
            <dl>
                <dt>foo</dt>
                <dd>bar</dd>
                <br />
                <dt>foo</dt>
                <dd>bar</dd>
            </dl>
            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


            • #36
              Nene, du kannst schon mit DL/DT/DD arbeiten. Entweder so
              Code:
              <dl>
                  <dt>foo</dt>
                  <dd>bar<br /></dd>
                  <dt>foo</dt>
                  <dd>bar</dd>
              </dl>
              oder so (besser!):
              Code:
              .space { padding-bottom: 1em; }
              <dl>
                  <dt>foo</dt>
                  <dd class="space">bar</dd>
                  <dt>foo</dt>
                  <dd>bar</dd>
              </dl>

              Kommentar


              • #37
                Original geschrieben von Estrela
                Oder aus jedem Block eine eigene dl.
                Genau:
                PHP-Code:
                $txt file('input.txt');

                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;

                Gruss
                H2O

                Kommentar


                • #38
                  Hallo jahlives.
                  Da halte ich es lieber mit TobiaZ, der es ungefähr so sagte, "Nicht alles, was machbar ist, ist auch richtig."
                  Ich möchte nicht ohne Not invaliden Code erstellen.
                  Und meines Wissens nach ist der erzwungene Zeilenumbruch <br /> eines der wenigen Tags, das einzeln einsetzbar ist.

                  @onemorenerd
                  Auch keine schlechte Idee, das <br />zwischen die dd´s zu stellen, falls das valide ist.
                  Mit class wollte ich an dieser Stelle nicht arbeiten, hab ich ja schon, um den Texten mehr Gewicht zu geben.
                  Gelernt habe ich gerade von Dir, das ein gelegentlicher Blick in den Quellcode einen echt weiterbringen kann.

                  @H2O
                  Deine freundlichen Fehler habe ich gefunden.
                  Fast perfekte Lösung. Kann aber vielleicht auch an meinem Zusammenbauen liegen.
                  Die Anzeige erfolgt jetzt wie gewünscht, aber mit zwei Warnungen:

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

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

                  Die Codezeilen:

                  PHP-Code:
                  // Pfad zu den Dateien
                  $path 'php/';
                  // nur Dateien öffnen, die diesem Muster entsprechen //Zeile 17
                  $filename_pattern '*.php';
                  $txt file('$filename_pattern');                                     // Zeile 19

                  foreach($txt as $zeile){
                      echo 
                  manipulate($zeile); 
                  Die erste Warnung sagt ja, das die Datei oder der Ordner nicht existieren, aber die Bearbeitung funktioniert ja, darum verstehe ich die Warnung nicht.

                  Ist ja schön, mal zu sehen, wie relativ einfach Text in die erste Zeile einzufügen ist. Bei der letzten sieht das schon etwas anders aus.

                  Gruß
                  Estrela
                  Denk positiv.

                  Kommentar


                  • #39
                    Grundlagen nachholen: Im Gegensatz zu Zeichenketten in Doublequotes (") findet in Zeichenketten, die durch Singlequotes (') delimiert sind, keine Variablen-Interpolation statt. Das heisst konkret, dass in der Zeichenkette '$filename_pattern' der String $filename_pattern steht und nicht der Wert der Variablen.
                    Darüber hinaus sei anzumerken, dass in diesem Fall weder Single- noch Doublequotes von Nöten sind.

                    Grüße
                    Zuletzt geändert von Griecherus; 18.06.2008, 15:41.
                    Nieder mit der Camel Case-Konvention

                    Kommentar


                    • #40
                      Hallo Griecherus.

                      Habe gerade mal die Hochzeichen ausgetauscht und die selben Fehlermeldungen erhalten.

                      Demnach scheint es egal zu sein, welche Hochzeichen ich verwende, weil ja sowol das Ergebnis als auch die Fehlermeldungen die gleichen sind. Deine Ausführungen hatte ich aber auch schon gelesen, ich bin ja noch mit PHP ganz am Anfang.

                      Gruß
                      Estrela

                      Edit/
                      Vielleicht beziehen sich die Fehlermeldungen ja auf . und .. ,
                      die ich am Anfang schon bei der Auflistung des Inhaltes des Arbeitsordners gesehen habe?
                      Zuletzt geändert von Estrela; 18.06.2008, 15:56.
                      Denk positiv.

                      Kommentar


                      • #41
                        Du definierst ja auch $path, das offensichtlich zu dem Ordner zeigt, in dem sich die Ziel-Dateien befindet, und lässt es danach unberührt. Ich mutmaße mal, dass der korrekte Pfad
                        Code:
                        php/*.php
                        und nicht
                        Code:
                        *.php
                        ist. Mit letzterem suchst du am selben Ort, an dem sich die verarbeitende Datei befindet. Das * als Wildcard Zeichen ist übrigens eher etwas für die Funktion glob().

                        Der Korrektheit halber: Es ist natürlich nicht egal, welche Zeichenketten-Begrenzer du verwendest. Nur, weil beide in deinem Fall nicht zum Ergebnis führen, macht sie das noch lange nicht zu dem oder den Schuldigen.
                        Zuletzt geändert von Griecherus; 18.06.2008, 16:03.
                        Nieder mit der Camel Case-Konvention

                        Kommentar


                        • #42
                          «".php» ist natürlich kein Filename, daher ist auch die Fehlermeldung klar. Und wo du Fehler gefunden haben willst, weiss ich auch nicht. Ich habe genau deinen Code nach «input.txt» kopiert, und es ist genau das rausgekommen, was du haben willst:
                          Code:
                          <!DOCTYPE html PUBLIC "-//W3C//DtD XHTML 1.0 Transitional//EN"
                          	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                          <html xmlns="http://www.w3.org/1999/xhtml1" lang="en"  xml:lang="en">
                          <head>
                          	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
                          	<link rel='stylesheet' type='text/css' href="./styles.css" />
                          	<title>TESTSCRIPT</title>
                          </head>
                          <body>
                          <h1>01. Instrução</h1> 
                          <dl>
                          <dt>Agora mesmo</dt>
                           <dd>Jetzt genau</dd>
                           <dt>Recebi esta Instrução</dt>
                           <dd>Erhalte diese Instruktion</dd>
                           <dt>Para dar aos meus Irmãos</dt>
                           <dd>Um zu geben meinen Geschwistern</dd>
                           <dt>Para todos se lembrar</dt>
                           <dd>Damit alle sich erinnern</dd>
                          </dl>
                          <dl>
                          <dt>Louvado seja</dt>
                           <dd>Gelobt sei</dd>
                           <dt>Bendito louvado está</dt>
                           <dd>Gesegnet und gelobt ist</dd>
                           <dt>Bendito louvado seja</dt>
                           <dd>Gesegnet und gelobt sei</dd>
                           <dt>Aquele, que me escutar</dt>
                           <dd>Jener, der mich hört</dd>
                          </dl>
                          <dl>
                          <dt>O meu Amor</dt>
                           <dd>Meine Liebe</dd>
                           <dt>Está no Cume de Jesus</dt>
                           <dd>Ist auf dem Gipfel mit Jesus</dd>
                          ....
                          Zuletzt geändert von H2O; 18.06.2008, 16:03.
                          Gruss
                          H2O

                          Kommentar


                          • #43
                            Hallo H2O.

                            Die einfachen Fehler waren:

                            Du hast im ersten echo </dl> und mit der letzten Anweisung preg_replace zum Schluß das <dl> eingefügt. Kleinigkeit.

                            Gruß
                            Estrela
                            Denk positiv.

                            Kommentar


                            • #44
                              Hallo.

                              Ich schlage vor, die Fehlermeldungen erst mal außen vor zu lassen. Die Aufgabe wird ja erstmal erfüllt. Ich möchte sowieso am Ende den Code nochmal durchsprechen, um möglichst viel daraus zu lernen.

                              Jetzt zum weiteren vorgehen.
                              Verständnisfrage: Bis jetzt haben Wir ja den modifizierten Text virtuell vorliegen, der dann mit echo auf den Bildschirm gebracht wird. Richtig?

                              Wenn ja, dann müßte jetzt die Datei geöffnet werden und der modifizierte Text in die Datei geschrieben werden und die Datei gespeichert werden.

                              Durch die foreach Schleife werden alle Dateien im Ordner abgearbeitet.

                              Benötigte Befehle:
                              fopen w+
                              fclose

                              Frage: Wenn die Datei mit w+ geöffnet ist, wie füge ich den modifizierten Text ein?
                              Kann ich danach die Datei einfach schließen oder muß ich noch speichern?

                              Gruß
                              Estrela
                              Denk positiv.

                              Kommentar


                              • #45
                                Steht dir PHP5 zur Verfügung, gehts ganz leicht per file_put_contents(). Andernfalls steht alles Nötige über das Öffnen, Scheiben und Schließen einer Datei doch im PHP-Manual, z.B. in der Spezifikation zu fwrite(), anschaulich an einem Beispiel.
                                Nieder mit der Camel Case-Konvention

                                Kommentar

                                Lädt...
                                X