Noob-Frage => mehrfaches {filtern} ???

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

  • #16
    Also ich versuchs mal ... (*Oh Jeh! ...*)

    Part 1 ist klar - Variable wird mit Text (HTML) gefüllt (in diesem Beispiel).

    Part 2 -
    PHP-Code:
     preg_match_all() 
    ist eine funktion, die dazu dient nach einem Stringmuster (in den Tuts wird es Pattern genannt) - dass man in den Klammern als ersten Parameter einträgt - zu suchen und dass Vorkommen (Anzahl oder im Falle des Vorkommens den String) zu speichern(über Backreference weiter hinten in den Parameter-Klammern). Also wenn der String "++text++" ist, kann ich preg_match_all so einstellen, dass es bei Angabe des Musters ++ ++ den String "text" z.B. nur einmal speichert, egal wie oft er vorkommt oder die Anzahl des Vorkommens auswertet (über advanced array auswertung). Das was ich hier Muster ++ ++ leienhaft genannt habe ist ein regulärer Ausdruck der aber sehr verschieden sein kann und deswegen verschiedene "Hilfszeichen" braucht, damit man schwierige oder komplexe Auswertungen machen kann. In unserem Falle hast du folgende Auswertung eingestellt :
    PHP-Code:
    preg_match_all('%\<(.*)\>\{(.*)\}\</\\1\>%si'$text$matchesPREG_SET_ORDER); 
    erster Parameter (vor erstem Komma) in den Klammern:

    -> das Zeichen ' is klar (wie " ) der Start und Endtag für einen auszuwertenden String.

    -> das Zeichen % hast du hier als "Delimiter" benutzt (kann auch ! oder / oder so sein und kennzeichnet den Beginn/Ende des regulären Ausdrucks[wird benötigt da dahinter noch Einstellunsoptionen erscheinen können])

    das < oder > oder { oder } wird durch \ ignoriert (i.d. Auswertung nicht berücksichtigt oder man könnte sagen geduldet wobei sie aber wichtig sind um das Suchmuster zu finden, weshalb sie dennoch eingetragen sind aber zB. nicht in der Backreferenz gespeichert würden)

    -> die Klammern dienen zum Markieren und Umfassen einer Gruppe von Zeichen die hier durch das nutzen der Sonderzeichen "." beliebig (und durch "*" beliebig viele einschließl. 0) sein dürfen und immer als Treffer indentifiziert werden würden. (Punkt und Stern sind in regulären Ausdrücken Symbole für eine ganze Zeichengruppe wodurch man gewährleistet, dass hier jeder String ausgewertet wird)

    ->\1\ versteh ich leider nicht, aber ich vermute es hat mir der Anzahl des Vorkommens des schließenden Tagslashes zu tun ? Halt! Nene - jetzt hab ichs *Knowledge Orgasmus krieg * : das is ne Backreference!! die besagt das zw </> die selbe Zeichenfolge enthalten sein muss wie in Gruppe "(1)" !! Haha! Sonst gilt dat janze nisch als Treffer *lol* - richtig?? da hätte auch {1} stehen künne, gell?

    -> naja und "s" und "i" ist halt wie angedroht nach dem wieder schließenden %
    eine Konfiguration wie gesucht wird: s = Suche wird auf jede Zeile neu angewandt und i = Groß oder Kleinschreibung ist "egal".

    ---

    im 2. Parameter steht der String oder in unserem Fall die Variable ($text) die den String enthält, der geprüft werden soll.

    im 3. Parameter werden die gefundenen Stringschnipsel in ein array (variable das zum array wird) gespeichert.

    und der letzte Parameter ist wieder eine Konfiguration darüber wie in dem array gespeichert wird, da ja die Suchergebnisse ganz unterschiedlich benötigt werden. In unserem Falle wird jede neue Übereinstimmung erstmal komplett (inklusive der Zeichen nach "\" [warum das so ist, keine Ahnung!]) in einem neuen Unterarray gespeichert und die Gruppen in einzelne Values zerlegt, was durch PREG_SET_ORDER festgelegt wird.

    das heißt wir haben 2 Übereinstimmungen: bei "<title>{hptitle}</title>" und bei "<body>{cms}</body>" richtig? Und jeweils drei Gruppen also ein array mit 2 unter arrays in denen unter id 0 jeweils der gesamte string und in dessen unterarrays jeweils die drei gruppen gespeichert sind.

    in dem darauf folgenden Teil wird das array so ausgewertet dass wir am ende ein array haben in denen uns der start tag und der platzhalter gegenüber stehen als key und value...

    ich denke die ausgabe echo muss ich nicht erklären

    richtig soweit ?? *aufgeregt guck*

    warum bei der neuzuordnung das so aussehen muss: $treffer[$match[1]] = $match[2] - hab ich zwar nicht gecheckt aber das find ich auch noch heraus

    Liebe Grüße und Danke für die Denkansätze, WL
    Zuletzt geändert von Willy_Lernen; 01.12.2004, 03:58.
    Es gibt keine dummen Fragen, es gibt nur schlecht gestellte Fragen und ein Haufen unnützer Antworten ...

    Kommentar


    • #17
      Na also, es gibt sie ja doch noch die Leute, die Handbücher lesen und verstehen wollen und das auch schaffen

      Original geschrieben von Willy_Lernen
      -> das < oder > oder { oder } wird durch \ ignoriert (i.d. Auswertung nicht berücksichtigt oder man könnte sagen geduldet wobei sie aber wichtig sind um das Suchmuster zu finden, weshalb sie dennoch eingetragen sind aber zB. nicht in der Backreferenz gespeichert würden)

      [...]

      -> naja und "s" und "i" ist halt wie angedroht nach dem wieder schließenden %
      eine Konfiguration wie gesucht wird: s = Suche wird auf jede Zeile neu angewandt und i = Groß oder Kleinschreibung ist "egal".

      [...]

      und der letzte Parameter ist wieder eine Konfiguration darüber wie in dem array gespeichert wird, da ja die Suchergebnisse ganz unterschiedlich benötigt werden. In unserem Falle wird jede neue Übereinstimmung erstmal komplett (inklusive der Zeichen nach "\" [warum das so ist, keine Ahnung!]) in einem neuen Unterarray gespeichert und die Gruppen in einzelne Values zerlegt, was durch PREG_SET_ORDER festgelegt wird.

      warum bei der neuzuordnung das so aussehen muss: $treffer[$match[1]] = $match[2] - hab ich zwar nicht gecheckt aber das find ich auch noch heraus
      < > { } haben in regulären ausdrücken eine besondere bedeutung, diese besondere bedeutung sollen sie hier aber nicht haben. durch "maskieren" mit dem \ nehme ich ihnen die besondere bedeutung und sie werden als "normales zeichen" behandelt.

      der modifier s (nach dem delimiter) besagt, dass durch den punkt auch zeilenumbrüche erfasst werden
      Code:
      <body>{cm
      s}</body>
      würde also auch funktionieren, das gegenteil von "s" ist "m"

      bei den ergebnissen hast du im index 0 immer das komplette muster und dazu gehören auch die maskierten teile

      was die neuzuordnung angeht: mach hinter print_r($treffer); mal
      PHP-Code:
      print_r($matches); 
      das sollte zum verständnis beitragen
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #18
        hab ich doch schon längst ...

        Frage zum Thema: ich hab das mal an einem String der html enthält probiert der wie folgt aussieht:

        tpl_index.php :
        PHP-Code:
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
        <
        html>
        <
        head>
        <
        meta http-equiv="content-type" content="text/html; charset=macintosh">
        <
        title><!-- {title} --></title
        der PHP Code ist (tpl_parse): // nur beispielhaft
        PHP-Code:
        $text fopen("tpl_index.php""r");
        $cms fgets ($text500);
        preg_match_all("%\{(.*)\}%si"$cms$matchesPREG_SET_ORDER);
        ... 
        usw// unwichtig bei dem besagten problem 
        das ergebnis ist der gespeicherte Ausdruck "{title} -->"

        Frage: Muss ich da den Fehler in meinem Suchmuster suchen oder hab ich ein PHP Problem auf meinem Rechner?


        1000 Dank mrhappiness nochmal für deine Gedult

        OffTopic:

        Klar willy_lernen



        Gruß
        Es gibt keine dummen Fragen, es gibt nur schlecht gestellte Fragen und ein Haufen unnützer Antworten ...

        Kommentar


        • #19
          Original geschrieben von Willy_Lernen

          OffTopic:

          Klar willy_lernen


          OffTopic:
          mag ja sein, aber das Forum erteilt keine Anfängerunterricht, sondern hilft bei tatsächlichen Probleme. Wenn du Grundlagen lernen möchtest, bitte nicht hier.

          Kommentar


          • #20
            OffTopic:

            Anfängerunterricht kann ich mir selber geben.
            Ich habe immerhin mehrere meiner Sites auf PHP Basis gebaut und habe eine Engine entwickelt die anhand der URLs den Content verschiedener Firmendivisions und die Sprachen zuordnet und die sprachlichen Gegenübers als Links generiert. Außerdem habe ich über Applescript und PHP meine eigenst entwickelte Agenturdatenbank (Filemaker) ausgelesen und für mySQL aufbereitet. Nur ob du's glaubst oder nicht, dabei bin ich bis heute um reguläre Ausdrücke drum herum gekommen. Im übrigen halte ich es für konstruktiver mir dann den link zu posten wo "ANFÄNGER" Fragen beantwortet werden, oder eine Antwort auf mein letzteres kleines Problem. Das hätte dich die gleiche Anzahl an Bits gekostet
            PHP-Code:
            sinnvoll $loesung $handlung überflüssig



            sorry, bin echt'n lieber Kerl, aber sowat muss nich sein!! Das grenzt ja schon an "Flaming"
            Gruß, WL

            PS: Wurde gefragt und hab geantwortet um zu zeigen dass ich nicht will dass mir andere meine Probleme lösen ohne dass ich es selbst versuche. War kein Unterricht.
            Zuletzt geändert von Willy_Lernen; 02.12.2004, 01:14.
            Es gibt keine dummen Fragen, es gibt nur schlecht gestellte Fragen und ein Haufen unnützer Antworten ...

            Kommentar


            • #21
              mal schauen, ob ich dich richtig verstehe:

              auf der einen Seite hast Du ein template mit Platzhaltern
              nach dem schema: {platzhalter}

              auf der anderen eine Reihe von Strings, die anstelle der Platzhalter eingesetzt werden sollen?

              Template einlesen:
              Code:
                  $fd = @fopen($tpl_file, 'r');
                  $tpl = fread($fd, filesize($tpl_file));
              Platzhalter in Variablennamen umwandeln:
              Code:
                  $tpl = preg_replace('/\{([a-z0-9_-]+)\}/is', "' . $\\1 . '", $tpl);
              -> in den Platzhalterklammern {} dürfen sich (alphanumerische) Zeichen befinden wie a-z0-9 und _ sowie -
              diese Zeichen werden als Gruppe definiert, nach der gesucht werden soll: [ ]
              und davon dürfen jeweils mehrere gefunden werden also +

              Klein-/Großschreibung wird ignoriert /i

              es können im Platzhalter zeilenschritte vorkommen: /s

              macht zusammen: /is

              die gefundenden Platzhalter werden durch sich selbst ersetzt:
              der erste in () befindliche reguläre Ausdruck - hier auch gleich der einzige - wird mit \1 angesprochen,
              damit \ nicht als gewöhnliches Zeichen, sondern als PCRE-Bestandteil von \1 verstanden wird: \\1
              also finde, was in () und ersetze es durch sich selbst mit einem vorangestellten $, suche in $tpl (worin $tpl_file eingelesen wurde).

              Jetzt steht in $tpl der Inhalt deines Templates mit lauter $... statt {...}

              auf der anderen seite ein assoziatives array: titel =>"Mein Titel", name =>"Mein Name" (?)

              aus den keys des array kannst du dynamisch variablen erzeugen und ihnen die zugehörigen values zuweisen per
              Code:
                  foreach($meinarray as $key => $val) $$key = $val;
              $$key: der Schlüssel titel ist nun $titel, sein Wert $val

              nun willst Du die werte in dein $tpl bekommen:
              Code:
                  eval("\$tpl = '$tpl';");
              evtl. solltest du vorher dieser Zeile alle " und '
              "entschärfen" mit

              Code:
               $tpl = addslashes($tpl);
              ich habe keine ahnung, ob das deine Frage war, aber vielleicht hilfts



              Kommentar


              • #22
                Jawolllllllllll !!!!!!!!!!!!! das war meine Fraaaaaage! Danke dir !!!!!!! Wo bist du, wo kommst du her! Ich geb dir'n Bier aus oder mach'n Bauchtanz!

                Ich weiß zwar noch nicht ob es der gleiche Ansatz ist wie das wo ich auch grad drann rumprobier (werdm ich gleich mal durch deine essay forsten), aber das Grundproblem was ich habe, hast du auf jeden Fall richtig gedeutet! Darum geht es!! Danke!!!

                PS: Meine letzte kl. Frage scheint sich beim rumprobiern beantwortet zu haben. Auf meinem Server scheint tatsächl. Probleme zu geben ein regulären Ausdruck mit dem Muster <!--{}--> zu parsen. Ohne <!-- --> klappt mein obiges Beispiel schonmal wie ich es wollte. Schade, ahtte ich extra probiert damit lehre Platzalter im Test-HTML Durchlauf der tpl dateien nicht im Browser erscheinen, sondern als Kommentar verstanden werden. Naja - aber du hast mir auf jeden Fall Mut gemacht. Werd' gleich mal stück für stück deine Erläuterung durchgehen und gucken ob ich aufm Holzweg bin oder nicht. 100000 Dank nochmal. Meld mich hier bald wieder.

                Ganz Lieben Gruß, WL
                Es gibt keine dummen Fragen, es gibt nur schlecht gestellte Fragen und ein Haufen unnützer Antworten ...

                Kommentar


                • #23
                  <!-- {abc} -->

                  kannst Du ersetzen durch <?/*{abc}*/?>

                  klar?


                  dann wird der reguläre ausdruck allerdings "komplex", weil ? , / , * und {
                  zur Sprache der Perl kompatiblen Ausdrücke PCRE gehören, sie müssen also entschärft werden
                  wenn sie einfache gesuchte Zeichen darstellen sollen:
                  Code:
                  $tpl = preg_replace('/<\?\/\*\{([a-z0-9_-]+)\}\*\/\?>/is', "' . $\\1 . '", $tpl);
                  dann musst Du strikt darauf achten, dass die schreibweise immer stimmt, sonst gibt's beim ausführen PHP-Probleme satt



                  Zuletzt geändert von inkognitus; 02.12.2004, 02:24.

                  Kommentar


                  • #24
                    Oha! Jetzt bin ich erregt, hehe ...

                    ein php kommentar als verdeckter platzhalter! nicht schlecht! Jetzt bin ich echt beeindruckt!!

                    Ich liebe Leute die sich was einfallen lassen wenn es darauf ankommt ungewöhnliche wege zu gehen. Ist die Idee von dir? Echt Klasse! Kann man dich buchen ??

                    Vielen Dank, Ich habe wieder einmal geler.... nein das ist ja hier verboten! Ich wollte sagen, es wurde mir sehr weiter geholfen.


                    Vielen Dank und ganz lieben Gruß!

                    Willy

                    PS: Bin immernoch dabei zu schaun ob das von vorher der Weg ist für meine TPL Engine. Vielleicht müsste ich in dem Fall von vorn anfangen. Ich hatte den platzhalter_register quasi vor den eigentlichen parser und wandler gelegt und das Array übergibt wieder zurück an das tpl über eregi_replace. In deinem Fall wird das tpl in der variable komplett als php verstanden und die tags mit $ ersetzt. Ich guck mal ob ich das jetzt richtig verstanden hab, und ob das nicht eventl. das Selbe ist und meld' mich nochmal - Bin noch etwas langsam darin. Dank dir auf jeden Fall für deine unglaublich konstruktive Hilfe.

                    PSPS: Kann ma' eine/r das Newbie bei ihm wegmachen, das scheint mir fehl am Platz - Gruß
                    Zuletzt geändert von Willy_Lernen; 03.12.2004, 03:01.
                    Es gibt keine dummen Fragen, es gibt nur schlecht gestellte Fragen und ein Haufen unnützer Antworten ...

                    Kommentar


                    • #25
                      ein newbie ist der, der sich für keinen hällt!

                      man kann nie genug dazu lernen wenn es um php und sonstige programmiersachen geht!

                      Kommentar


                      • #26
                        OffTopic:

                        Jepp! Korrekt ... deswegen ja auch mein Nick
                        da hast du vollkommen recht- wie heißt es doch so schön:

                        Der der weiß dass er nichts weiß, der weiß schon viel !

                        Nur das im letzten post war eher retorisch von mir gemeint, weil er mir so viel geholfen hat und dabei so konstruktiv war wie ich es leider seltend in boards erlebe, deswegen wollte ich ihm ein Kompliment machen mit dem Satz, er ist bestimmt kein Newbie mehr, vor allem bei der Artder Lösungansätze ...


                        gecheckt? ...




                        Ganz Liebe Grüße, Willy_Lernen

                        PS: Ich glaub' du solltest es lieber in OT packen ...
                        Es gibt keine dummen Fragen, es gibt nur schlecht gestellte Fragen und ein Haufen unnützer Antworten ...

                        Kommentar

                        Lädt...
                        X