Teil von SELFHTML Forum Teil von SELFHTML Forumsarchiv Teil von 2005 Teil von August

SELFHTML Forumsarchiv
Funktionsübergabe in preg_replace

Informationsseite
  1. Seite (PHP) Funktionsübergabe in preg_replace von Schorsch, 31. 08. 2005, 14:32
nach unten

Funktionsübergabe in preg_replace

Die folgende Nachricht zum Thema stammt von: Schorsch, 31. 08. 2005, 14:32

Guten Tag

Ich habe einen Array:

$my['baum'] = 'tanne';
$my['haus'] = 'hochhaus';
$my['tier'] = 'ente';


Und ich habe einen String:

$str = 'Auf der {baum} hinter '
      .'dem {haus} sitzt '
      .'eine {tier}.';

echo preg_replace("#\{(.+?)}#se", '$my[\'$1\'])', $str);

Liefert mir:
"Auf der Tanne hinter dem hochaus sitzt eine ente."

Soweit so gut. Nun möchte ich folgendes:


Ich habe erneut einen String:
$str = 'Hier ein {function:my_func({baum})} wald.';

Und ich habe eine Funktion:
my_func($string)
{
  return 'AAA'.$string.'BBB';
}

preg_replace müsste nun so gebaut werden, dass:

"Hier ein AAAtanneBBB wald."

raus kommt.


Es gelingt mir, eine Funktion zu übergeben und diese ausführen zu lassen, doch leider schaffe ich nicht, das Argument "tanne" der Funktion zu geben. Man müsste quasi das Argument der Funktion austauschen und erst dann die Funktion ausführen lassen.

Wie muss ich:

preg_replace("#\{function:(.+?)}#se", '$1', $str);

verändern, damit my_func('tanne') ausgeführt wird? Ist das überhaupt möglich?

Besten Dank!

Schorsch

nach obennach unten

Funktionsübergabe in preg_replace

Die folgende Nachricht zum Thema stammt von: Dennis, 31. 08. 2005, 21:30

Hi Schorsch,


»» preg_replace("#\{function:(.+?)}#se", '$1', $str);

Probiers mal so:

// Sub-RegEx für Funktionsname
$funcname = "([^(])+";
// Sub-RegEx für Funktionsargumente
$variable = "\{([^)*)\}";
// RegEx zusammenbasteln
$regex = "#\{function:$funcname\($variable\)\}#se";
// Ersatz
$replace = '$1($my[\'$2\')';
// Ausführen...
preg_replace($regex, $replace, $string);


Habs nicht getestet, aber so ungefähr könnte es gehen.


MfG, Dennis.
--
Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|

Die Stoßstange ist aller Laster Anfang! (Häfft)

nach obennach unten

Funktionsübergabe in preg_replace

Die folgende Nachricht zum Thema stammt von: Schorsch, 01. 09. 2005, 11:33

Salut Dennis

Wow! Habs hingekriegt.
Besten Dank!!!

Gruss
Schorsch

nach obennach unten

Funktionsübergabe in preg_replace

Die folgende Nachricht zum Thema stammt von: Dennis, 01. 09. 2005, 15:03

Hi Schorsch,


»» Wow! Habs hingekriegt.
»» Besten Dank!!!

Bitte - an dieser Stelle möchte ich dich aber noch mal auf die (oft) mit eval() (und im Prinzip ist bewirkt der e-Modifier bei preg_replace() nichts anderes) verbundenen Sicherheitsrisiken hinweisen.

In deinem Fall könnte jetzt jeder der Zugriff auf die Templates hat irgendwelche PHP Funktionen aufrufen - für den Anfang würde ja ein einfaches phpinfo() schon reichen. Du hast also je nach dem jetzt schon eine Sicherheitslücke.


MfG, Dennis.
--
Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|

Das Leben ist kein Warenhaus - es nimmt nichts zurück. (Anette Louisan)

nach oben
Teil von SELFHTML Forum Teil von SELFHTML Forumsarchiv Teil von 2005 Teil von August

© 1998-2006 Seite Impressum, Software: Classic Forum