Veröffentlicht 24. Juni 200817 j Hallo Community, ich habe ein Problem mit preg_replace(). Und zwar möchte ich gerne gekennzeichnete Zeichenketten durch eine Variable ersetzen. Beispiel: bla {${asd}} bla PHP soll nun $bla auslesen und an die Stelle von {${bla}} setzen. Das funktioniert nur nicht ganz... Der Code: preg_match_all('/\{\$\{([a-z][0-9_a-z]*)\}\}/i', $cont, $mtch); foreach ($mtch[1] as $val) { global $$val; } $cont = preg_replace('/\{\$\{([a-z][0-9_a-z]*)\}\}/ei', '$\1 ? $\1 : \'<!-- Missing variable: \1 -->\'', $cont);[/PHP] Hier werden zuerst - da der Vorgang in einer Funktion ist - alle Variablen mit global geholt. Danach sollen sie eingesetzt werden. Ganz davon abgesehen, dass es für manche als totaler Humbug erscheinen wird, müsste es eigtl. gehen. Edit: PS: Die Variablen exestieren - daran kanns also nicht liegen. Er ersetzt die Zeichenketten auch, nur halt nicht durch den Wert der Variable, sondern durch ihren Namen. Ich vermute, es liegt am Replace-Parameter, dass ich irgendwas falsch gemacht habe... Weiß jemand, was ich da falsch gemacht habe? Danke schonmal im Vorau! Gruß Trex Bearbeitet 24. Juni 200817 j von Trex88
24. Juni 200817 j Hi Trex, dein Beispiel passt irgendwie nicht zu deinem Text.. preg_match_all() <-> preg_replace() $bla <-> $asd was soll da wie ersetzt werden... ? du machst doch gar kein replace? Gruß, Markus
25. Juni 200817 j Du könntest preg_replace_callback() benutzen: <?php function _replaceVar($_arrMatch) { $mixRes = ''; if (isset($GLOBALS[$_arrMatch[1]])) { $mixRes = $GLOBALS[$_arrMatch[1]]; } return $mixRes; } $strVarTest = 'test'; $intVarTest = 1; $strTest = 'Das ist ein Test mit den Werten {${strVarTest}} und {${intVarTest}}.'; echo $strTest."<hr>"; $strTest = preg_replace_callback('/\{\$\{([^\}]+)\}\}/','_replaceVar',$strTest); echo $strTest; ?> [/PHP] Edit: Ich habe mir gerade mal den e-Modifier angeschaut. Es geht auch so einfacher: [PHP] $strTest = preg_replace('/\{\$\{([^\}]+)\}\}/e','\$GLOBALS[\\1]',$strTest); Ich vermute, Du müsstest in Deinem Beispiel das Dollar-Zeichen escapen und für die Back-Referenz zwei Escape-Zeichen verwenden. Bearbeitet 25. Juni 200817 j von Monty82
2. Juli 200817 j Hallo, erstmal danke für die Antworten, und sorry für meine etwas verwirrende Beschreibung. Ich meinte $asd an Stelle von $bla und {${asd}} an Stelle von {${bla}}. Leider lag der Fehler ganz woanders, dummerweise habe ich nur den OB - eigentlich zur besseren Übersichtlichkeit gedacht - immer automatisch leeren lassen, wenn ein Fehler auftrat. Dadurch wurde der konkrete Fehler nicht angezeigt und ich habe ein wenig im Dunklen rumgetappt. Trotzdem vielen Dank für eure Mühen! =) Gruß Trex Bearbeitet 2. Juli 200817 j von Trex88
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.