Linkmuster

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

  • Linkmuster

    hi

    bei einer seite sollen links angezeigt werden, die aus einer datenbank ausgelesen werden. die links liegen als array vor. in einem template wird festgelegt, wie ein link aussehen muss.

    also im template steht:

    Code:
    {$link <A HREF="$link_pfad">$link_text</A> }
    also so genau steht es als text im template drin. $link und $link_text sind dann die platzhalter für die jeweiligen elemente eines 2-dimensionalen arrays (und keine variablen in php!).

    wie kann ich so ein muster herauslesen und dann jeweils so oft wie nötig mit den ersetzten platzhaltern ausgeben? (ich denke es ist am besten, wenn man dieses muster mit einem regulären ausdruck heraussucht, und dann mit ner schleife ausgibt und die platzhalter jeweils mit str_replace() ersetzt, aber ich kenn mich leider noch nicht so gut in php aus )

    kann mir jemand sagen wie ich das in php progge?

  • #2
    was für eine template engine ist das denn?

    kann die keine schleifen?
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      okay.. zum verständnis..

      du hast ein template in irgendeiner datei?
      und da steht EINMAL drin, wie ein link ausehen soll..
      an die stelle soll eine ganze LISTE echter links eingesetzt werden?

      okay...

      du musst natürlich erstmal das template irgendwie einlesen.
      am schönsten mit file('template.tpl') in ein array. dort steht dann in jeder zelle eine zeile der template datei... damit das ganze noch ein fortlaufender text wird und kein array mit einzelzeilen, basteln wir das mit implode zusammen.

      PHP-Code:
        $tpl=implode("",file('template.tpl')); 
      sooo nun müssen wir die stelle finden und ersetzen...
      da wir nicht wissen, wie genau unser link aussieht, matchen wir zunächst einen ausdruck {$link irgendwas }

      PHP-Code:
      preg_match('!{$link (.*)}!U',$treffer); 
      nun haben wir den gesamten platzhalter von { bis } in $treffer[0];
      und nur den teil in der inneren Klammer in $treffer[1];

      ergo können wir $treffer[1] als vorlage verwenden.

      auf die prüfung, ob darin $link_pfad und $link_text überhaupt enthalten sind, werde ich verzichten.

      wir durchlaufen also eine schleife und basteln uns den echten Link-Code

      PHP-Code:
      $code_neu="";

      foreach (
      $linkliste as $alink) {
         
      $code_neu.=str_replace(array('$link_pfad','$link_text'),$alink,$treffer[1])."\n";

      wenn ich mich nicht vertippt habe, dann sollten wir jetzt ein stück code besitzen, dass mehrere zeilen mit jeweils einem echten link enthält (vorausgesetzt, unser array mit den links hieß vorher auch $linkliste)

      jetzt müssen wir nur noch unser codefragment an die stelle des platzhalter setzen.

      PHP-Code:
      $tpl=str_replace($treffer[0],$code_neu,$tpl);

      // und ausgeben

      echo $tpl

      hoffe das hat etwas geholfen, und ich habe ungefähr das getroffen, was du suchtest...

      für das nächste mal: bitte etwas ausführlicher die aufgabe beschreiben

      greetz, high
      Zuletzt geändert von highrise; 08.07.2006, 00:45.
      Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
      When everything else fails, manipulate the data...
      Beschriftungen / Großformatdruck / Werbemittel

      Kommentar


      • #4
        @ Abraxax: ne eigene

        danke highrise! genau das hab ich gemeint!! sorry, dass ich es nicht genau beschreiben konnte, ich versuch es nächstes mal etwas ausführlicher.

        ne frage:
        preg_match('!{$link (.*)}!U',$treffer);
        was heißt das "!" am anfang und das "!U" am ende des regulären ausdrucks?

        noch was:

        $tpl=implode("",file('template.tpl'));
        das einlesen der datei habe ich so gemacht (das müsste eigentlich schneller sein, da es nicht 2 mal gespeichert werden muss oder?):
        PHP-Code:
                $handle fopen("design.tpl""r");
                
        $design_code fread($handlefilesize("design.tpl"));
                
        fclose($handle); 

        Kommentar


        • #5
          das Einlesen der Datei ist so natürlich okay...

          welche Methode schneller geht hab ich noch nicht ausprobiert.. however... es dürfte unwesentlich sein.

          die ! am Anfang und ende des regex sind meine Delimiter. Die könnten genausogut / oder § sein
          müssen eben nur ein Zeichen sein, welches im rexex selbst nicht vorkommt..

          das U hinter dem schließenden ! steht für ungreedy und sorgt dafür, dass der match beim ersten auftreten von } zumacht und nicht erst beim letzten...

          falls du näml sonst noch später nen anderen Platzhalter im template hättest, der auch auf } endet (etwa {$img <img blablub} würde der gesamte ausdruck von {$link bis zur LETZTEN } gematcht werden.. so nur bis zur ersten...

          greetz, high
          Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
          When everything else fails, manipulate the data...
          Beschriftungen / Großformatdruck / Werbemittel

          Kommentar


          • #6
            danke, nur eins verstehe ich noch nicht: für was sind diese delimiter gut? hab folgenden satz gegoogelt:
            Das eigentliche Muster wird von sogenannten Delimitern am Anfang und am Ende begrenzt, damit für den Interpreter ersichtlich ist, wo das Muster anfängt und wo es aufhört.
            ich versteh das nicht ganz, wieso soll der interpreter wissen wollen wo der ausdruck beginnt, die zeichenkette ist doch der ausdruck oder??

            Kommentar


            • #7
              Da Du am Ende des Suchmusters noch Modifier angeben kannst, musst Du irgendwie festlegen, wo das eigentliche Pattern aufhört und wo die Modifier anfangen - dazu brauchst Du die Delimiter.

              Zum Einlesen der Datei ist file_get_contents() am schnellsten.
              Die Zeit hat ihre Kinder längst gefressen

              Kommentar


              • #8
                Beispielregex: "/abc/Ui"
                Der Delimiter dient als Trenner zwischen dem Pattern (abc) und den Modifiern (Ui).
                Eigentlich braucht man also nur den zweiten /, denn der erste trennt ja nichts.
                Aber PHP muß wissen, welches Zeichen überhaupt als Delimiter benutzt wird und da ist die Konvention:
                Das 1. Zeichen des ganzen Ausdrucks gibt an, welches Zeichen das Suchmuster von den Modifiern trennt.
                Das hat zur Folge, dass man nicht ohne Delimiter arbeiten kann, selbst wenn man gar keine Modifier benutzt.

                Kommentar


                • #9
                  PHP-Code:
                  preg_match('!{$link (.*)}!U',   $tpl,    $treffer); 

                  Kommentar


                  • #10
                    weia...

                    *mitderhandvordiestirnhau*.. natürlich..

                    greetz, high
                    Good programming is 40% experience, 20% skill, 20% RTFM, 15% caffeine, and 5% attention to detail.
                    When everything else fails, manipulate the data...
                    Beschriftungen / Großformatdruck / Werbemittel

                    Kommentar


                    • #11
                      ok, der delimiter trennt also das pattern von den modifiern.

                      danke nochmal an alle, für die schnellen und guten antworten. das ist wirklich ein super forum!

                      Kommentar

                      Lädt...
                      X