Funktionsübergabe in preg_replace
Schorsch
- php
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
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.
Salut Dennis
Wow! Habs hingekriegt.
Besten Dank!!!
Gruss
Schorsch
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.