preg_match in php

kerstel

Erfahrenes Mitglied
Hallo,

ich hab ein Array was ungefähr so aussieht:

Code:
Array
(
    [lDelim] => {
    [rDelim] => }
    [Var1] => Var1_Value
    [VarArray1] => VarArrayValue1
    [VarArray2] => VarArrayValue2
    [Var2] => Array
        (
            [0] => Var2_Value1
            [1] => Var2_Value2
        )

)

In einem anderen File (Template) steht zwischen viel HTML Code Templatevariablen z.B. das {$Var1}, irgendwo anders {$VarArray1} usw.

Ich möchte nun, dass über das Template gegangen wird und die Templatevariablen mit dem Wert aus dem obrigen Array ersetzt, der Key des Arrays entspricht dabei der Templatevariable. Erschwerend kommt hinzu das { } was im Template eine Variable einschliesst über Variablen definiert werden kann (im array ldelim und rdelim):

PHP:
$rdelim="{"
$ldelin="}"

Ich komm hier nicht weiter, hat jemand eine idee?

Danke und Gruß
Kerstel
 
Moin kerstel,

ich würds mit ner while-Schleife Probieren, falls ich dich recht verstanden habe.

Ich nehme mal an, du hast im Template ca. soetwas zu stehen:

Code:
{lDelim}Var1{rDelim}

und möchtest, dass daraus Var1_Value wird.

Bei der while-Schleife würden im 1. Durchlauf die Klammer-Variablen ersetzt, und im nächsten {Var1} durch Var1_Value

Falls du etwas anderes meinst, vergiss einfach, was ich geschrieben hab :)
 
Hi,

Moin kerstel,

ich würds mit ner while-Schleife Probieren, falls ich dich recht verstanden habe.

Ich nehme mal an, du hast im Template ca. soetwas zu stehen:

Code:
{lDelim}Var1{rDelim}

und möchtest, dass daraus Var1_Value wird.

ich glaube, das war eher so gemeint:

Code:
text {Var1} noch mehr text

Nur dass man die Delimiter über Variablen konfigurieren kann. Könnte also auch so aussehen:

Code:
text [Var1] noch mehr text

Ich würde mir einfach aus dem Array mit den Werten serach-/replace-Arrays aufbauen und die per str_replace auf den Text anwenden. Kleines Beispiel:

PHP:
   $text = "In einem anderen File (Template) steht zwischen viel HTML Code Templatevariablen z.B. das {Var1}, irgendwo anders {VarArray1} usw.";
   $variables = array("Var1" => "Var1_Value",
    "VarArray1" => "VarArrayValue1",
    "VarArray2" => "VarArrayValue2",
    "Var2" => array("Var2_Value1", "Var2_Value2"));
   $ldelim = "{";
   $rdelim = "}";
   $search = array();
   $replace = array();

   foreach($variables as $key => $value) {
      $search[] = $ldelim . $key . $rdelim;
      if(is_array($value)) {
	 // Nur ein Beispiel. Was soll denn bei einen Array genau ausgegeben werden?
	     $replace[] = implode(',', $value);
      } else {
	     $replace[] = $value;
      }
   }

   $result = str_replace($search, $replace, $text);
   echo $result;

LG
 
ich glaube, das war eher so gemeint:

genau, nicht {Var1} sondern {$Var1}, damit ich später Variable von Funktionen unterscheiden kann :)

Gibt es keine Möglichkeit über reguläre Ausdrück? Hab mir sagen lassen das wäre schneller. Hab nur schon jede Menge dazu gelesen und Blick den Mist einfach nicht.

Später kommen ja noch andere Dinge hinzu, das z.B. im Template eine if Abfrage stattfinden kann z.b.

{if $a==1} Test {else} Kein Test {/if}

Das geht ja dann nicht mehr so einfach über replace oder?

Viele Grüße
Kerstel
 
Zuletzt bearbeitet:
Hi,

genau, nicht {Var1} sondern {$Var1}, damit ich später Variable von Funktionen unterscheiden kann :)

Gibt es keine Möglichkeit über reguläre Ausdrück? Hab mir sagen lassen das wäre schneller. Hab nur schon jede Menge dazu gelesen und Blick den Mist einfach nicht.

Das kann man so pauschal nicht sagen. Für das einfache Beispiel würde ich mal behaupten, das str_replace schneller ist.

Später kommen ja noch andere Dinge hinzu, das z.B. im Template eine if Abfrage stattfinden kann z.b.

{if $a==1} Test {else} Kein Test {/if}

Das geht ja dann nicht mehr so einfach über replace oder?

Viele Grüße
Kerstel

So einfach nicht. Aber das geht genausowenig so einfach über einen regulären Ausdruck (vor allem nicht über einen). Als Erstes solltest Du Dir darüber klar werden, was die Template-Sprache genau umfassen soll. Google am Besten mal nach "PHP Template Engine" und schau Dir einige Lösungen an.

LG
 
Nur als kurzer Einwurf:
Reguläre Ausdrücke sind grundsätzlich als langsam anzusehen.
 
Hi,

ich dachte, da es ja nur Spass an der Freude ist, dass ich es einfach wachsen lasse.

Ich hab mir verschiedene Engines angeschaut (smarty, patTemplate..) und komme mit diesen Regulären Ausdrücken einfach nicht klar. Ist es echt so das String_replace schneller ist? Auch wenn im Template später Foreach Schleifen und If Abfragen ablaufen?

Viele Grüße
Kerstel
 
Grundsätzlich ist str_replace schneller als die regulären Ausdrücke, aber man kann nicht alles mit str_replace machen, da manche Ersetzungen zu komplex sind.
Aber wo man es benutzen kann, sollte man es auch tun und nicht mit Kanonen auf Spatzen schießen ;)
 
ok, aber im meinem Fall wäre es ja dann Sinnvoller mit regulären Ausdrücken, oder?

Gerade wegen den Kontrollstrukturen später. Oder doch besser eine Mischung?
 
Zurück