Ergebnis 1 bis 5 von 5

Thema: Array-Element beim Ersetzen // Templatesystem

  1. #1

    Array-Element beim Ersetzen // Templatesystem

    Guuden Taag.
    Wie ich gerade (seit ein paar Tagen) an einem Templatesystem für mein 1337 Forum arbeite, stoße ich auf so einige Probleme. Im Template stehen die zu ersetzenden Variablen z.B. in der Form $global[name] für den Namen des Forums. Da ich eben nicht jeden String einzeln ersetzen möchte (wie ich es bisher, wenn ich Templates verwendet habe, gemacht habe), versuche ich jetzt, mittels preg_replace alle $global[xxx] zu suchen und durch die entsprechende Variable zu ersetzen. Ich poste mal einen Teil der Template-Klasse:
    PHP-Code:
    class template

        var 
    $str;
        var 
    $data = array();
        function 
    initialize()
        {
            
    $this->data['name'] = 'Name des Forums';
            
    $this->data['desc'] = 'Name des Forums ist ein Forum, das sich hauptsächlich mit Videospielen befasst.';
            
    # ...
        
    }
        function 
    load ($file)
        {
            
    # ...
        
    }
        function 
    replace()
        {
            
    $this->str preg_replace ('#\$global\[(.*)\]#Uis'$this->data['\\1'], $this->str);
        }
        
    # ...

    Das Einlesen des Templates funktioniert, die Ausgabe der $data-Variablen funktioniert, wenn ich nur nach einer bestimmten $global[] suchen lassen, funktionert auch das Ersetzen - Aber auf diese Art und Weise eben nicht (Augenmerk auf die letzte entscheidende Zeile). Er scheint die $global-Variablen im Template zwar zu finden, allerdings steht an Stelle dieser in der Ausgabe nichts, anstatt der entsprechenden Variable (bei $global[name] z.B.). Muss ich bei dieser Art von Ersetzung noch irgendwas beachten, muss ich das generell anders machen oder was ist da falsch? Und gäbe es evtl. noch klügere Methoden, z.B. diese $global-Variablen automatisch durch die entsprechenden $data-, $global, $whatever-Variablen zu ersetzen?

  2. #2
    Versuchs mal mit preg-match-all() falls ein Zeichen Mehrmals vorkommen sollte.

    Zudem ist es IMHO schöner sich eigene "BB Codes" auszudenken als einfach Variablen in den Raum zu werfen.

    Du könntest es z.B. so lesen, dass nach bestimmten <!-- BBcode --> Elementen gesucht wird, werden sie gefunden und ersetzt, toll. Läuft das Script nicht, ists zwar ärgerlich aber zumindest bekommt der User keine Fehlermeldungen ausgespuckt.

  3. #3
    preg_match_all scheint nur die Anzahl der Treffer zu zählen, wodurch am Ende nichts als eine 0 ausgegeben wird. Frag mich, wieso da jetzt null rauskommt, mit preg_replace findet er die $global[]s weiterhin.
    Und zum zweiten: Äh ... hä? Fehler bekommt man dann vielleicht nicht, aber ersetzt werden die Variablen trotzdem nicht, wodurch das dem User auch nicht viel mehr bringt O_o
    In diesem Beispiel steht jetzt zum Beispiel <title>$global[name]</title>, da soll also der Name des Forums reinreplacet werden. Was soll mir deine Methode da jetzt genau bringen? O_o

  4. #4
    Du kannst nicht im Array-Index von $this->data \1 benutzen. Das \1,\2,\n wird nur geparsed wenn es direkt in dem String steht der an preg_replace übergeben wurde steht. Dein Skript sucht in $this->data nach dem Element mit dem Index '\1'. Das gibts nicht -> es ist leer -> es erscheint nichts im Template.

    Du könntest es so machen, dass alle Vorkommnisse von $global durchgegangen und jeweils einzeln ersetzt werden. z.B. so:
    PHP-Code:
    while(preg_match('#\$global\[(.*)\]#Uis'$this->str$matches))
    {
      
    $this->str preg_replace('#\$global\['.$matches[1].']#Uis'$this->data[$matches[1]], $this->str);

    Ungetestet.

  5. #5
    Zitat Zitat von Dingsi
    Du könntest es so machen, dass alle Vorkommnisse von $global durchgegangen und jeweils einzeln ersetzt werden. z.B. so:
    PHP-Code:
    while(preg_match('#\$global\[(.*)\]#Uis'$this->str$matches))
    {
      
    $this->str preg_replace('#\$global\['.$matches[1].']#Uis'$this->data[$matches[1]], $this->str);

    Yay, funktioniert, danke
    Okay, dann bis zum nächsten Problem ^^"

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •