[PHP] Nach Platzhalter suchen und mit eval() bearbeiten

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Murdoc, 11. April 2007 .

Schlagworte:
  1. 11. April 2007
    Nach Platzhalter suchen und mit eval() bearbeiten

    topic + problem haben sich geändert, bitte ab posting: 9+10 weiterlesen!!
     
  2. 11. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    $template = str_replace('{blabla}',$blablubb,$template);
     
  3. 11. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    ich seh da den zusammenhang zu php noch nicht. ich würd nen text-editor nehmen:

    1. ersetze $blahblubb mit $blahtemp
    2. ersetze {blahblubb} mit $blahblubb
    3. ersetze $blahtemp mit {blahblubb}
     
  4. 11. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    so könnte es funktionieren:
    PHP:
    <? php
    // platzhalter und inhalt in array ablegen
    $vars  = array(
        
    "BLA"  =>  $bla ,
        
    "LALA"  =>  $lala
    );
    // template laden
    $file  file_get_contents ( "templates/tmp.html" );
    foreach(
    $vars  as  $key  =>  $value ) {
        
    $s [] =  "{" . $key . "}" ;
        
    $r [] =  $value ;
    }
    // ersetzten
    $html  str_replace ( $s , $r , $file );
    echo 
    $html ;
    ?>
     
  5. 11. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    ich gehe mal davon aus, dass du eine template engine machen willst
    daher würde ich dir empfehlen mit preg_match_all() die variabeln rauszusuchen und dann mit eval() zu arbeiten
    damit kannst du die z.B. direkt ersetzen lassen oder auch vorher testen ob sie überhaupt existieren
    eine einfacherere lösung wäre mir gerade nicht bekannt
    genauere infos zu den funktionen findest du bei php.net oder google.de
     
  6. 12. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    PHP:
    ereg_replace ( "{blabla}" " $blabla " $gesamtercode );
    muesste auch klappen
     
  7. 12. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    richtig. hatte auch versucht mit eval zu arbeiten, aber leider hat ich nur probleme damit. und auf php.net hatte ich mich schon stundenlang in eval und preg_[...] reingelesen, aber irgendwie steig ich nicht ganz durch, deswegen der versuch platzhalter zu ersetzen.

    anfangs hatte ich sowas:

    $template = $tpl->get("output");
    $template = str_replace("{platzhahalter}", $tpl->get("platzhalter"), $template);

    nur halte ich des ned für sinnvoll, da mehere platzhalter vorhanden sind und das script auch erweiterbar werden soll.

    (tpl classe ist vorhanden und funkioniert!)
     
  8. 12. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    wenn du das so variabel machen willst wirst du um eval nicht drum rum kommen
    ansonsten gibt es die alternativen die bereits gepostet wurden, wo du allerdings alles vorher zuweisen musst
    ich hab momentan leider keine zeit, sonst würd ich das ja gerne mal testen
    aber du könntest ja damit anfangen uns zu sagen was bei dir mit eval() schief gegangen ist
     
  9. 12. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    das war mein versuch mit eval:

    PHP:
    $template  $tpl -> get ( "output" );  // in "output" steht das: $header
    $template  = eval( "\$header = \"" . $tpl -> get ( "header" ). "\";" );
    print(
    $template );  //nix, kein output, kein header
    wie gesagt, benutze eval() zum erstenmal
     
  10. 13. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    push?

    ich wär super dankbar wenn mir jemand ein "verständliches" einführungstutorial schreiben/zeigen würde, da ich auf php.net und ein wenig google nicht wirklich für meinen erfahrungsstand verständliche erklärungen fand.

    hat jemand was?
     
  11. 13. April 2007
    AW: Nach Platzhalter suchen und mit eval() bearbeiten

    meine aller erste template-class in php:
    PHP:
    <? php
    class  tpl  {
        var 
    $dir  "templates/" ;
        var 
    $end  ".tpl" ;
        var 
    $file ;
        var 
    $html ;
        var 
    $vars  = array();
        
        function 
    load ( $file ) {
            
    $this -> file  $this -> dir . $file . $this -> end ;
            if(
    file_exists ( $this -> file )) {
                
    $this -> html  file_get_contents ( $this -> file );
                if(isset(
    $this -> vars )) {
                    
    $s  = array();
                    
    $r  = array();
                    foreach(
    $this -> vars  as  $key  =>  $value ) {
                        
    $s [] =  "{" . $key . "}" ;
                        
    $r [] =  $value ;
                    }
                    
    $this -> html  str_replace ( $s , $r , $this -> html );
                }
                return 
    $this -> html ;
            } else {
                die(
    "Template <b>" . $this -> file . "</b> konnte nicht geladen werden!" );
            }
        }
        
        function 
    vars ( $vars ) {
            if(isset(
    $vars ) AND  is_array ( $vars )) {
                foreach(
    $vars  as  $key  =>  $value ) {
                    
    $this -> vars [ $key ] =  $value ;
                }
                return 
    $this -> vars ;
            }
        }
        
        function 
    view () {
            echo 
    $this -> html ;
        }
    }

    $tpl  = new  tpl ;

    // platzhalter mit inhalt setzten und füllen
    $tpl -> vars (array(
        
    "NICK"  =>  "funland" ,
        
    "SONSTIGES"  =>  $variable ,
        
    "NEWS_ROW"  =>  $tpl -> load ( "news_row" // ein template als platzhalter speichern
    ));

    // template laden aus dem ordner templates/
    $tpl -> load ( "test_site" );

    // template ausgeben
    $tpl -> view ();
    ?>
    leider habe ich kaum zeit um alles zu kommentieren. wenn man aber sich das genauer anschaut, merkt man sofort das es auch nicht so kompliziert ist ^^
     
  12. 13. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    Du weist $header den Wert von $tpl->get("header") zu willst dann aber $template ausgeben? Geht nicht...

    PHP: eval - Manual
    Guck dir den Returntype an...
     
  13. 13. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    wenn du eval unbedingt haben möchtest...^^

    PHP:

    $title 
    "News" ;
    ob_start ();
    include(
    "templates/text.html" );

    $temp = addslashes ( ob_get_contents ());
    ob_end_clean ();
    // parse the template to replace variables with their values
    eval( "\$temp=\" $temp \";" );
    echo 
    $temp ;


    im template steht $title, das wird nun durch News ersetzt.
     
  14. 13. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    aber ich hol mit $tpl->get("das"); ein template in dem einzig und allein (in worten) $header steht. wenn ich das so augeben lasse hab ich $header da stehen. aber da ich will das nicht $header ausgegeben wird solles das $header als echte phpvariable behandeln und der variablen $header den wert: $tpl->get("header"); zuweißen.

    diese variable steht nun in $template und soll da dann auch ausgegeben werden... aber jetzt steht garnix drinnen. netmal $header
     
  15. 13. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    Keine Ahnung wovon du redest. Fakt ist, du gibst wahrscheinlich nichts fuer eval zurueck. Fakt ist auch, dass $header den Wert deines Templates erhaelt. Da $header in deinem Template aber unset ist, ist dieser nichts.
     
  16. 14. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    ja sorry^^ is halt sehr zum erklären...

    also im template "seite" das ich mit $tpl->get("seite") hol steht das:

    Code:
    $header
    und das soll mit:

    PHP:
    eval( "\$header = \"" . $tpl -> get ( "header" ). "\";" );
    gesetzt werden. stimmt das so? - wenn ja warum geht das nicht?
     
  17. 14. April 2007
    AW: Nach Platzhaltersuchen und mit Variable mit gleichem Namen erstetzten

    Somit haettest du $header den Wert des Templates header zugewiesen. Sollte alles stimmen. Aber eval selbst hat keinen Returnwert, ausser du gibst einen zurueck. Mach danach einfach mal var_dump() oder echo mit $header.
     
  18. 14. April 2007
    AW: Nach Platzhalter suchen und mit eval() bearbeiten

    Entweder verstehe ich grad dein Problem nicht komplett richtig oder es liegt daran das du die Funktionsweise von eval() nicht richtig kennst

    Ein Kleines Beispiel:
    PHP:
    $foo  true ;

    if (
    $foo ) {
       
    $bar  'function1' ;
    } else {
       
    $bar  'function2' ;
    }

    eval(
    $bar  '(1, 2, 3);' );
    eval() setzt jetzt den übergebenen String zusammen also in dem Fall so:

    PHP:
    function1 ( 1 2 3 );
    und jetzt bewertet es diesen String neu (das währe so als wie wenn dieser String ein Teil deines Skriptes ist) d.h. er ruft in dem Fall die Funktion "function1" mit den parametern 1,2 und 3 (tut natürlich nichts zur Sache, dient ja nur als Beispiel) auf.

    mit
    PHP:
    eval( "\$header = \"" . $tpl -> get ( "header" ). "\";" ); 
    würde jetzt der Inhalt von $tpl->get("header") in den String geschrieben und dann würde die variable $header in der anschließenden Bewertung (oder von mir aus: Ausführung) des Strings den inhalt von $tpl->get("header") bekommen. Da es die Varibale $header vorher in deinem Skript aber noch nicht gibt und auch später nicht gebraucht wird wirst du damit wenig erreichen. (Ich glaube das hat weiter oben bereits jemand gemeint)

    Wenn mich jetzt nicht irre, willst du aber erreichen, das der text "$header" in einem String (oder was auch immer) durch einen anderen (z.b. die html teile für den header) ersetzt werden sollen, das geht so natürlich nicht .

    Liege ich mit dem was du vor hast richtig?
     
  19. 14. April 2007
    AW: Nach Platzhalter suchen und mit eval() bearbeiten

    soweit alles stimmt sollte doch jetzt in $header der wert von $tpl->get("header") stehen, aber wenn ich $header ausgeben will kommt nüscht..

    so sieht das jetzt aus:
    PHP:
    $template  $tpl -> get ( "seite" );
    $template  = eval( "\$header = \"" . $tpl -> get ( "header" ). "\";" );
    echo 
    $template ;
    ausgegeben wird mir nix.

    ich schlaf mal drüber!
     
  20. 14. April 2007
    AW: Nach Platzhalter suchen und mit eval() bearbeiten

    ?( ?(
    $template wird natürlich nichts enthalten weil der Code-String nichts enthält was mit einem return zutun hat

    jetzt verstehe ich aber - endlich - was du mit deinem skript erreichen willst ! :]

    was du suchst ist das:
    PHP:
    $template  $tpl -> get ( 'seite' );
    $header  $tpl -> get ( 'header' );
    eval(
    '$template = "'  $template  '";' );

    echo 
    $template ;



    Hier habe ich mal ein kleines Beispiel:
    PHP:
    $template  '$header $body bla bla bla $footer' ;
    $header  'Das ist der Header-Teil !!!'  "\n\n" ;
    $body  'Das ist der Body-Teil !!!'  "\n\n" ;
    $footer  'Das ist der Footer-Teil !!!'  "\n\n" ;
    eval(
    '$template = "'  $template  '";' );

    echo 
    $template ;
    liefert folgendes:
    Code:
    Das ist der Header-Teil !!!
    
     Das ist der Body-Teil !!!
    
     bla bla bla Das ist der Footer-Teil !!!
    
    Wichtig: Um Missverständnisse zu vermeiden informiere dich am besten gleich mal was der Unterschied zwischen ' und " ist.

    lg area-52
     
  21. 14. April 2007
    AW: Nach Platzhalter suchen und mit eval() bearbeiten

    Aber mal eine generelle Frage, leider, wozu?

    Beim vBull wo zum Beispiel über das PlugIn Modul PHP Code in die Datenbank geschrieben wird, wird eval benutzt um diesesn Code auszuführen, aber wozu sowas in einem Template?

    Ich persönlich hab auch einige TemplateEngines privat gebaut, aber mal ehrlich. Dann doch lieber smarty, oder professionelle Alternativen nehmen. Wozu sich die Arbeit machen? Um dann nur im Ansatz die Funktionen von sowas wie smarty zu haben?

    Na klar am Anfang denkt man sich, dass man den ganzen Zeug nicht brauch den z.B. smarty anbietet, aber umso größer die Projekte umso lieber werden einem die Funktionen.
     
  22. 14. April 2007
    AW: Nach Platzhalter suchen und mit eval() bearbeiten

    ich hatte vor meiner lanparty leider keine zeit mehr das folgende script zu posten, hoffe das hilft dir noch:
    PHP:
    <? php
      $template 
    "Test {blub} juhu {lala['test']} rofl {nicht_gesetzt}" ;
      
    $blub  "Var" ;
      
    $lala [ 'test' ] =  'lol' ;
      
      
    $vars  = array();
      
    preg_match_all  ( "/\{(.*)\}/siU" $template $vars PREG_SET_ORDER );
      foreach (
    $vars  as  $key => $value ) {
          eval (
    'if (isset($' . $value [ 1 ]. ')) $template = str_replace($value[0], $' . $value [ 1 ]. ', $template);' );
      }
      echo 
    $template ;
    ?>
    $template ist ein ganz einfacher string wie du siehst
    den kannst du wahrscheinlich mit deinem $tpl->get() holen
    dadrin stehen die variabeln in den geschweiften klammern, die du mal haben wolltest
    die 2 folgenden variabeln habe ich (wie man aus den namen hoffentlich erkennen kann) einfach mal zum testen angelegt
    so, nun der interessantere teil des codes ^^
    zur sicherheit lege ich das array $vars vorher schoneinmal an
    dann suche ich mit preg_match_all alle ausdrücke raus, die ein { am anfang und ein } am ende haben
    diese werden im array $vars gespeichert
    nun gehe ich mit einer schleife genau dieses array durch
    $value ist dabei jeweils das aktuelle unter-array, bei dem position 0 den gesamten gefundenen ausdruck mit den klammern enthält, und 1 das was dazwischen steht
    dann benutze ich eval, und zwar habe ich dort ersteinmal normalen php code reingeschrieben, als wenn ich kein eval hätte
    dann füge ich einfach an den stellen, wo die entsprechende variable sein soll den string ein
    dadurch entsteht ein code der in etwa so aussieht:
    if (isset($blub)) $template = str_replace($value[0], $blub, $template);
    wobei die 2 blub's grade eingefügt wurden, $value[0] enthält ja sowieso den gesamten ausdruck der ersetzt werden soll
    dieser code wird jetzt ganz normal ausgeführt, und beim nächsten schleifendurchlauf steht da halt anstelle von $blub ein $lala['test']
    hoffe das hilft dir irgentwie weiter eval() zu verstehen
     
  23. 14. April 2007
    AW: Nach Platzhalter suchen und mit eval() bearbeiten

    als erstes: vielen vielen dank an alle!

    die funktion eval() bereitet mir immer noch kopfschmerzen, aber jetzt bin ich dem ziel auf alle fälle näher denn je

    auch an dich ein dankeschön, smarty hört sich sehr gut an!
    nach der menge hirnschmalz das bei mir durch eval() verbrannt ist kommst du mit einem "fertig template parser" daher... na danke (soll heissen warum net scho früher)

    http://smarty.php.net/distributions/manual/de/Smarty-2.5.0-docs.pdf

    werd mir das in aller ruhe bei ner tasse kaffee durchlesen. mehr als davon lernen kann ich ja nicht.
     
  24. 14. April 2007
    AW: Nach Platzhalter suchen und mit eval() bearbeiten

    Ja weil ich denke die ganzen Beispiele die hier gebracht wurden, zum Beispiel der letzte von Schmitz ... da ist eval() einfach überflüssig.

    Und so eine kompilierende, cachende TemplateEngine wie Smarty, die auch höhere objektorientierte Programmierung mit Entwurfs Mustern und so unterstützt, die viel bietet und eine schöne Api hat ... ist einfach was schönes. Und die engine dann so zu erweitern wie man möchte steht auch effektiv auch jedem frei..

    Hier zum Biespiel mal ein Auszug aus einem meiner smarty - templates.

    HTML:
    {if $bIsAjax === false}
    {include file=header.tpl}
    {/if}
     <div id="ContentHead">
     <p>
     Portfolio
     </p>
     </div><!--Ende #ContentHead-->
     <div class="clear"></div><!--Ende clearing div for ie bugs-->
     <div class="ContentMain" id="Portfolio">
    {if $bIsEditing}
     {include file=portfolio-part-edit.tpl}
    {else}
     {include file=portfolio-part-content.tpl}
    {/if}
     <br />
     <br />
     <br />
     <br />
     </div><!--Ende #Portfolio-->
     <div id="ContentFooter">
    {if showAdminLink() === true}
     <a href="adminportfolio.html" onclick="changeMainContainer(this);return false;">Add</a> |
    {/if}
    {if $iPortfolioCount > 3}
     Gehe zu Seite:
    {section name=iPortfolioPage start=1 loop=$iPortfolioCount step=3}
     <a {if ($smarty.get.ipage == $smarty.section.iPortfolioPage.rownum) || ((!$smarty.get.ipage) && ($smarty.section.iPortfolioPage.rownum == 1))}class="active" {/if}href="portfolio_{$smarty.section.iPortfolioPage.rownum}.html" onclick="changeMainContainer(this);return false;">{$smarty.section.iPortfolioPage.rownum}</a>,
    {/section}
    {/if}
     </div>
    {if (showAdminLink()) && ($iPortfolioCount > 0)}
     <div id="PortfolioDeleteAdditions">
     <label for="MarkAll"><input id="MarkAll" name="all" onclick="select_all(this.checked, '.aPortfolioIds')" type="checkbox" />Mark All</label>
     <button id="btn_portfoliodelete" name="btn_portfoliodelete" onclick="sendInputToServer('portfoliodelete', 'deleteportfolio_0.html');return false;" type="submit">L&ouml;schen</button>
     </div>
    {/if}
    {if $bIsAjax === false}
    {include file=footer.tpl}
    {/if}
    
    Hier sieht man auch zum Beispiel ne for - schleife und so .... ist einfach ganz angenehm. Die smarty-funktion strip, lege ich dir auch ans herz .... oder oben sieht man auch direkten zugriff auf das get array über smarty ... uvm

    Aber eins noch, smarty ist natürlich kein allheilmitteln und es gibt noch weitere engines die auch gut laufen.

    Dann hab ich dir jetzt auch noch ne kleine Doku zu smarty geupped, die auch sehr hilfreich ist und an aktualität nicht verloren hat .... aber dafür aktueller ist als die die du oben verlinkt hast ...
    Download offline!
     
  25. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.