tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
1443
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    solar22 solar22 ist offline Mitglied
    Registriert seit
    Nov 2007
    Beiträge
    24
    Einen schönen guten Morgen,

    ich hab in meinem HTMLCode folgende Platzhalter definiert:
    Code :
    1
    
    [plugin]ViewArticle[/plugin]

    Jetzt möchte ich, das PHP den Platzhalter sucht und durch einen include() Befehl ersetzt, das klappt auch soweit ganz gut in meiner Templateklasse:
    PHP-Code:
          $bbcode = new BBCodeParser();
          $bbcode->addExtraBBCode("plugin", "/\[plugin\](.*)\[\/plugin\]/isU", "<?php include'$1.php';?>");
          $text = $bbcode->Parser($text);
    Nur parst er den Code nicht?
    Im Quelltextmodus vom FF wird der PHPCode rosa angezeigt.
    Wie bringe ich PHP dazu, das er den Code parst?

    Gruß und einen schönen Samstag wünscht euch,

    solar22
     

  2. #2
    Avatar von CookieBuster
    CookieBuster CookieBuster ist offline <?= "Hello World" ?>
    Registriert seit
    Sep 2008
    Ort
    Münsingen (BW)
    Beiträge
    420
    Blog-Einträge
    4
    Welcher Code wird nicht geparst?

    Außerdem solltest du etwas mehr code zeigen, denn der Interessante Teil fehlt (wo die Funktion im Kontext steht usw.)

    Mit eval kann man PHP-Code ausführen, auch wenn ein String bereits geparst wurde (Stichwort.: Ausgabepuffer)
     
    There are only 10 types of people in the world — those who understand binary, and those who don't.

    Mach mal einer das Licht an, ich hör nix!

    Why is 6 afraid of 7? Because 7 8 9.

  3. #3
    solar22 solar22 ist offline Mitglied
    Registriert seit
    Nov 2007
    Beiträge
    24
    Hallo,
    entschuldige die späte Antwort -> Schule.

    Momentan nutze ich noch diesen BBCode Parser:
    PHP-Code:
    <?php

    class BBCodeParser
    {
        private 
    $BBCodesDefault="";
        private 
    $BBCodesExtra="";
        private 
    $rawText;

        public function 
    __construct()
        {
            if(!isset(
    $this->BBCodesDefault) OR !isset($this->BBCodesExtra))
            {
                
    trigger_error("Es fehlen wichtige Variablen! Bitte kontrollieren Sie die Klasse.");
            }
            
    $this->addDefaultBBCodes();
        }

        private function 
    addDefaultBBCodes()
        {
            
    $this->BBCodesDefault = array("b" => array("/\[b\](.*)\[\/b\]/isU" => "<b>$1</b>"),
                                          
    "i" => array("/\[i\](.*)\[\/i\]/isU" => "<i>$1</i>"),
                                          
    "url" => array("/\[url\=(.*)\](.*)\[\/url\]/isU" => "<a href=\"$1\">$2</a>"),
                                          
    "youtube" => array("/\[youtube\](.*)\[\/youtube\]/isU" => "<object width=\"560\" height=\"340\"><param name=\"movie\" value=\"http://www.youtube.com/v/$1\"></param><param name=\"allowFullScreen\" value=\"true\"></param><param name=\"allowscriptaccess\" value=\"always\"></param><embed src=\"http://www.youtube.com/v/$1\" type=\"application/x-shockwave-flash\" allowscriptaccess=\"always\" allowfullscreen=\"true\" width=\"560\" height=\"340\"></embed></object>"),
                                          
    "img" => array("/\[img\](.*)\[\/img\]/isU" => "<img src=\"$1\" alt=\"\" title=\"\" />"));
        }

        public function 
    addExtraBBCode($name$bbCodePattern$htmlCodePattern)
        {
            if(!isset(
    $this->BBCodesExtra[$name]))
            {
                
    $this->BBCodesExtra[$name] = array($bbCodePattern => $htmlCodePattern);
            }
            else
            {
                
    trigger_error("BBCodename existiert bereits");
            }
        }

        private function 
    parseExtraCode()
        {
            if(!
    is_array($this->BBCodesExtra)) return $this->rawText;

            foreach(
    $this->BBCodesExtra as $BBCode => $array)
            {
                foreach(
    $array as $BBCodePattern => $htmlPattern)
                {
                    
    $this->rawText preg_replace($BBCodePattern$htmlPattern$this->rawText);
                }
            }
            return 
    $this->rawText;
        }

        private function 
    iniParse($rawText)
        {
        
    $this->rawText $rawText;
            foreach(
    $this->BBCodesDefault as $BBCode => $array)
            {
                if(
    stripos($this->rawText"[".$BBCode."]") !== FALSE && stripos($this->rawText"[/".$BBCode."]") !== FALSE)
                {
                    return 
    true;
                }
                continue;
            }
            if(
    is_array($this->BBCodesExtra))
            {
                foreach(
    $this->BBCodesExtra as $BBCode => $array)
                {
                    if(
    stripos($this->rawText"[".$BBCode."]") !== FALSE && stripos($this->rawText"[/".$BBCode."]") !== FALSE)
                    {
                        return 
    true;
                    }
                    continue;
                }
            }

            return 
    false;
        }

        private function 
    parseCode()
        {
            if(
    $this->rawText == "")
            {
                
    trigger_error("Diese Funktion muss erst durch iniParse() initialisert werden!");
            }

            foreach(
    $this->BBCodesDefault as $BBCode => $array)
            {
                foreach(
    $array as $search => $html)
                {
                    
    $this->rawText preg_replace($search$html$this->rawText);
                }
            }

            return 
    $this->rawText;
        }

        public function 
    Parser($rawText)
        {
            
    //$this->rawText = htmlentities($rawText);
            
    if(!$this->iniParse($rawText)) return $this->rawText;
            
    $this->parseCode();
            
    $this->parseExtraCode();
            return 
    $this->rawText;
        }
    }
    ?>
    Aus der mySQL DB wird der Inhalt der Seite gelesen, zB:
    Code :
    1
    2
    3
    
    Hallo ich bin <b>Peter</b>,<br/>
    hier ein paar News von mir: <br />
    [plugin]ViewArticle[/plugin]

    Nun soll, das [plugin]ViewArticle[/plugin] durch ein <?php include 'plugins/ViewArticle.php'; ?> ersetzt werden.
    Klappt auch soweit ganz gut, nur parst er das ganze nicht.
    Die TPL Engine ist recht simpel, also kein Smarty oder so.
    Geändert von solar22 (23.03.10 um 16:50 Uhr)
     
    Gruß.
    solar22

  4. #4
    Avatar von Da_Chris
    Da_Chris Da_Chris ist offline Mitglied Platin
    Registriert seit
    Feb 2007
    Ort
    Augsburg
    Beiträge
    651
    Mit dem bbcode parser kannst du das eher nicht lösen da der parser nur bbcode elemente in html elemente umwandelt und du willst ja ein PHP-File einbinden.
    Ein Include bedeuted das die datei auch an der stelle ausgeführt wird. In deinem Beispiel sollte das einen Fehler erzeugen.
    Du wirst wohl um einen eigenen Parser nicht herumkommen.
    Dazu brauchst du preg_match() und ziehst dir den Pluginnamen heraus.
    Mit dem kannst du dann an gewünschter Stelle deine PHP-File einbinden.
     
    Google und die Forensuche beantworten 50% aller Fragen!
    Pflichtlektüre: Das PHP Handbuch als Windows Help Datei

    Bitte Benutzt für Source-Code immer die richtigen Formatierungstags:
    [PHP]Für PHP diese Tags[\PHP] ... [HTML]Für HTML diese Tags[\HTML] ... [SQL]Für SQL diese Tags[\SQL] ... [CODE]Für sonstigen Code[\CODE]

    Wenn mein Beitrag hilfreich war bitte ich um eine positive Bewertung.

  5. #5
    solar22 solar22 ist offline Mitglied
    Registriert seit
    Nov 2007
    Beiträge
    24
    Nun, ich hab jetzt mal das hier geschrieben, anstatt der BBCoder Parser Geschichte:

    PHP-Code:
        $text = preg_replace('/\[plugin\](.*?)\[\/plugin\]/', "<?php include'\1.php'?>", $text);
    Trotzdem wird das ganze nicht geparst.
    Die Frage, die ich mir stelle, wie bekomm ich PHP nun dazu, das er den Code mit parst?
     
    Gruß.
    solar22

  6. #6
    Avatar von tombe
    tombe tombe ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2004
    Ort
    Möglingen (BaWü)
    Beiträge
    3.109
    Du schreibst ganz oben das du im HTML Code einen Platzhalter definiert hast. Bedeutet das auch das die Datei die Endung HTML hat? Dann kann PHP nicht geparst werden.
     
    Sollte ein Tipp von mir geholfen haben, habe ich nichts gegen eine entsprechende Bewertung oder ein Danke und wenn ein Problem gelöst ist, dann den Beitrag bitte auch als erledigt markieren.

    Was ich gar nicht leiden kann sind User die es nicht für nötig halten auf Antworten zu reagieren, die Themen nicht als erledigt markieren und/oder die sich nicht für Hilfe bedanken.

  7. #7
    Avatar von Da_Chris
    Da_Chris Da_Chris ist offline Mitglied Platin
    Registriert seit
    Feb 2007
    Ort
    Augsburg
    Beiträge
    651
    Zitat Zitat von solar22 Beitrag anzeigen
    Nun, ich hab jetzt mal das hier geschrieben, anstatt der BBCoder Parser Geschichte:
    PHP-Code:
        $text = preg_replace('/\[plugin\](.*?)\[\/plugin\]/', "<?php include'\1.php'?>", $text);
    Trotzdem wird das ganze nicht geparst.
    Mh du solltest meinen Beitrag ganz lesen....
    Ein Include führt die PHP-File an exakt der Stelle aus wo du den Include hinschreibst....
    Das ist wie als ob du den gesamten Inhalt kopierst und statt <?php include'\1.php'; ?> einfügst.
    Es kann also so nicht gehen.
    Wie schon oben beschrieben hole dir den Plugin Namen und setze dein Include an die richtige Stelle.
    Geändert von Da_Chris (23.03.10 um 17:55 Uhr)
     
    Google und die Forensuche beantworten 50% aller Fragen!
    Pflichtlektüre: Das PHP Handbuch als Windows Help Datei

    Bitte Benutzt für Source-Code immer die richtigen Formatierungstags:
    [PHP]Für PHP diese Tags[\PHP] ... [HTML]Für HTML diese Tags[\HTML] ... [SQL]Für SQL diese Tags[\SQL] ... [CODE]Für sonstigen Code[\CODE]

    Wenn mein Beitrag hilfreich war bitte ich um eine positive Bewertung.

  8. #8
    solar22 solar22 ist offline Mitglied
    Registriert seit
    Nov 2007
    Beiträge
    24
    Der HTML Code wird dynamisch aus einer mysql Tabelle geladen.
    Der Platzhalter soll dann ersetzt werden und dann geparst werden.
     
    Gruß.
    solar22

  9. #9
    solar22 solar22 ist offline Mitglied
    Registriert seit
    Nov 2007
    Beiträge
    24
    @Da_Chris
    Der include soll auch genau da ausgeführt werden, wo der Platzhalter steht.
    Und der php include() wird ja auch korrekt umgewandelt.
    Das ist wie als ob du den gesamten Inhalt kopierst und statt <?php include'\1.php'; ?> einfügst.
    Es kann also so nicht gehen.
    Diesen Teil versteh ich nicht.
    Wie gesagt, er macht schon aus
    HTML-Code:
    [plugin]ViewArticle[/plugin]
    das hier:
    <?php include 'plugins/ViewArticle.php'; ?>
     
    Gruß.
    solar22

  10. #10
    Avatar von Da_Chris
    Da_Chris Da_Chris ist offline Mitglied Platin
    Registriert seit
    Feb 2007
    Ort
    Augsburg
    Beiträge
    651
    Ich seh grad ich hab deinen Code nicht ganz genau angesehen.
    Du hast ja "" um deine Include Anweisung gepackt.

    Dann sieht die Sache anders aus (aber leider immer noch nicht richtig)
    Was bei dir passiert er schreibt die include anweisung in deinen html code.
    Ich weis nicht wie du die Ausgabe machst aber damit es funktioniert müsstest du die Ausgabe des geänderten html codes in eval() packen.
    Also
    PHP-Code:
    eval($text); 
     
    Google und die Forensuche beantworten 50% aller Fragen!
    Pflichtlektüre: Das PHP Handbuch als Windows Help Datei

    Bitte Benutzt für Source-Code immer die richtigen Formatierungstags:
    [PHP]Für PHP diese Tags[\PHP] ... [HTML]Für HTML diese Tags[\HTML] ... [SQL]Für SQL diese Tags[\SQL] ... [CODE]Für sonstigen Code[\CODE]

    Wenn mein Beitrag hilfreich war bitte ich um eine positive Bewertung.

  11. #11
    solar22 solar22 ist offline Mitglied
    Registriert seit
    Nov 2007
    Beiträge
    24
    Mh, an eval(); hab ich auch schon gedacht.
    Aber er liest ja nicht nur PHP Code aus der DB.
    Und würd ich aus allem HTML ein echo machen, wäre eval ja auch ein Sicherheitsloch und würde des Parser unsinnig belasten.
     
    Gruß.
    solar22

  12. #12
    Avatar von Da_Chris
    Da_Chris Da_Chris ist offline Mitglied Platin
    Registriert seit
    Feb 2007
    Ort
    Augsburg
    Beiträge
    651
    Zitat Zitat von solar22 Beitrag anzeigen
    Mh, an eval(); hab ich auch schon gedacht.
    Aber er liest ja nicht nur PHP Code aus der DB.
    Und würd ich aus allem HTML ein echo machen, wäre eval ja auch ein Sicherheitsloch und würde des Parser unsinnig belasten.
    Nun eval find ich selber nicht das beste aber so wie du es angehst geht es nunmal nur mit eval.

    Eine andere Strategie wäre mit preg_replace_callback().
    In der callback dein plugin ausführen und dessen Ausgabe gebuffert in den html code als replace setzen.
     
    Google und die Forensuche beantworten 50% aller Fragen!
    Pflichtlektüre: Das PHP Handbuch als Windows Help Datei

    Bitte Benutzt für Source-Code immer die richtigen Formatierungstags:
    [PHP]Für PHP diese Tags[\PHP] ... [HTML]Für HTML diese Tags[\HTML] ... [SQL]Für SQL diese Tags[\SQL] ... [CODE]Für sonstigen Code[\CODE]

    Wenn mein Beitrag hilfreich war bitte ich um eine positive Bewertung.

  13. #13
    solar22 solar22 ist offline Mitglied
    Registriert seit
    Nov 2007
    Beiträge
    24
    Hallo,
    ich hab das ganze nun so gelöst:
    PHP-Code:
          if(preg_match('/\[plugin\](.*?)\[\/plugin\]/'$text)) {
          
    preg_match_all('/\[plugin\](.*?)\[\/plugin\]/'$text,$plugins);
          
    $plugins $plugins[1];
        
    $i 0;
          do {
          require_once(
    "application/plugins/$plugins[$i].php");
          
    $content $plugins[$i]();

          
    $text preg_replace("/\[plugin\]$plugins[$i]\[\/plugin\]/"$content$text); 
        
    $i++; 
          } while(
    $i count($plugins)); 
          } 
    Ich danke für den Tipp mit den callback!
    Darüber bin ich auf die Lösung gekommen
    Danke.
     
    Gruß.
    solar22

  14. #14
    Avatar von Da_Chris
    Da_Chris Da_Chris ist offline Mitglied Platin
    Registriert seit
    Feb 2007
    Ort
    Augsburg
    Beiträge
    651
    Hatte ich zwar ein wenig anders im Sinn aber wenn es geholfen hat gern geschehen
     
    Google und die Forensuche beantworten 50% aller Fragen!
    Pflichtlektüre: Das PHP Handbuch als Windows Help Datei

    Bitte Benutzt für Source-Code immer die richtigen Formatierungstags:
    [PHP]Für PHP diese Tags[\PHP] ... [HTML]Für HTML diese Tags[\HTML] ... [SQL]Für SQL diese Tags[\SQL] ... [CODE]Für sonstigen Code[\CODE]

    Wenn mein Beitrag hilfreich war bitte ich um eine positive Bewertung.

Ähnliche Themen

  1. Platzhalter durch PHP-Code ersetzen
    Von Aragon83 im Forum PHP
    Antworten: 9
    Letzter Beitrag: 24.09.09, 20:10
  2. Platzhalter in IFRAME ersetzen.
    Von Marky-1 im Forum PHP
    Antworten: 0
    Letzter Beitrag: 09.09.08, 12:38
  3. Antworten: 2
    Letzter Beitrag: 02.11.07, 14:41
  4. Tool: Ersetzen mit Platzhalter (wie in phpmyadmin)
    Von DerUnsympath im Forum Microsoft Windows
    Antworten: 0
    Letzter Beitrag: 26.05.07, 16:42
  5. Platzhalter ersetzen
    Von liquidbeats im Forum Flash Plattform
    Antworten: 1
    Letzter Beitrag: 07.10.05, 09:51

Stichworte