PHP-Funktionen in String finden und ausführen...
Dieter
- php
Hallo,
der Content (html) für meine HP habe ich in eine DB ausgelagert, d.h. DB-Query -> String -> echo string.
Mein Problem ist nun, das ich gerne in verschiedenen Seiten PHP-Funktionen wie auch Variablen verwenden möchte, so das ich den String vor dem echo dementsprechend nach PHP-Code filtern und diesen dann entsprechend abarbeiten lassen müsste.
Meine Grundidee war, dieses über regex zu lösen, also z.B.:
$string = 'Hallo Welt<br>#include("funktion.php");##echo $funktionsergebnis;#<hr>Weiteres HTML';
regex -> Suche nach "#[*]#"
eval -> Suchergebnis
regex -> PHP-Funktionen aus string entfernen und durch Funktionsergebnis ersetzten.
Soweit, sogut...
Mein Problem ist jetzt aber nun, das ich
a) überhaupt nicht durch die regex-Kommandos (geschweige denn die eigentliche regex) durchschaue
b) mir leider auch nicht klar ist, wie ich den Code entsprechend anlegen muß.
Ich habe selbstverständlich schon die einschlägigen Tuts durchgeschaut und auch gegooglet, nur so richtig leuchtet mir das ehrlich gesagt alles nicht so ganz ein :-(...
Ich hoffe, das ich mein Vorhaben und Problem nicht allzu kompliziert umschrieben habe und das mir hier jemand weiterhelfen kann.
VG
Dieter
Hi Dieter!
Du solltest dich mit einer Template-Engine vertraut machen. Diese kann nämlich ohne Probleme die Ersetzungen durchführen, die du brauchst.
Ich benutze sehr gerne TinyButStrong.
Dein Weg ist einfach zu umständlich. ;-)
MfG H☼psel
Hi Dieter!
Du solltest dich mit einer Template-Engine vertraut machen. Diese kann nämlich ohne Probleme die Ersetzungen durchführen, die du brauchst.
Ich benutze sehr gerne TinyButStrong.
Dein Weg ist einfach zu umständlich. ;-)MfG H☼psel
Hallo H☼psel,
sicherlich sind Template-Engines der einfachere Weg (ich benutze wenn meistens Smarty), aber für mich ist jedes Projekt auch ein wenig "Learning by doing", so das, da es sich hierbei sicherlich nicht um eine komplette Template-Klasse handelt die benötigt wird, zuerst immer die "eigene" Umsetzung (auch wenn schwieriger) bevorzuge. Dennoch vielen Dank für deine Antwort :-).
VG Dieter
HI,
Template muss nicht sein
$content = <<<content
<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>$titel</title>
.....
...
content;
//Ausgabe
exit($content);
Hello Dieter,
der Content (html) für meine HP habe ich in eine DB ausgelagert, d.h. DB-Query -> String -> echo string.
Mein Problem ist nun, das ich gerne in verschiedenen Seiten PHP-Funktionen wie auch Variablen verwenden möchte, so das ich den String vor dem echo dementsprechend nach PHP-Code filtern und diesen dann entsprechend abarbeiten lassen müsste.
Meine Grundidee war, dieses über regex zu lösen, also z.B.:
$string = 'Hallo Welt<br>#include("funktion.php");##echo $funktionsergebnis;#<hr>Weiteres HTML';
regex -> Suche nach "#[*]#"
eval -> Suchergebnis
regex -> PHP-Funktionen aus string entfernen und durch Funktionsergebnis ersetzten.
Das ist wirklich eine interessante Denksportaufgabe, Deinen Knoten aufzulösen.
Jedenfalls versuchst Du das Rad gerade neu zu erfinden.
PHP-Code in Datenbanken ist nichts neues und auch nicht besonders ungewöhnlich, aber wer sollte ausführbar sein. Du schreibst nun nicht PHP-Code in die Datenbank, sondern HTML-Code, der wiederum PHP-Code enthält. Du benutzt aber nicht die von PHP vorgesehenen Open-Tags dafür.
Hallo Welt<br>
<?php
include("funktion.php");
echo $funktionsergebnis;
?>
<hr>Weiteres HTML
Wäre ja ein gültiges HTML-Schnipsel mit embedded PHP-Code
Bei eval() geht PHP aber davon aus, dass im String gültiges PHP drin steckt.
Das kannst Du dann mit eval wieder in den HTML-Kontext stellen lassen.
<?php ### eval.php ###
$str = '?><p>Hallo <?php echo $string ?></p><?php echo sqrt(33);';
$string = "hallo Steve!";
eval ($str);
?>
So funktioniert es auch mit "ausgegrenztem HTML-Code".
Dein Stück Code müsste also folgendermaßen aussehen:
------------------------------------------------------
<?php ### funktion.php ###
$funktionsergebnis = 'Hier ist die Lösung';
?>
------------------------------------------------------
<?php ###dieter-code.php ###
$mixcode =
"?>Hallo Welt<br>
<?php
include("funktion.php");
echo $funktionsergebnis;
?>
<hr>Weiteres HTML<?php ";
eval($mixcode);
?>
-------------------------------------------------------
In den Files natürlich immer nur die Zeilen zwischen den Opener-Tags inclusive dieser.
Wenn Du nun also noch einen Schritt weitergehen willst, dann müsstest Du einen neuen Tag erfinden für den PHP-Opener und einen neuen für den Abschluß-Tag.
Die könntest Du dann mittels str_replace() oder, wenn es sicherer werden soll, mittels eigener Funktion oder eben Regualr Expressions wieder in die eingestellten PHP-Tags zurücktauschen und dann den String in oben gezeigter Manier an eval() übergeben.
Bedenke auch, dass einmal deklarierte und implementierte Funktionen für die geasamte Scriptlaufzeit gelten. Solltest Du also in den Datensätzen Funktionen deklarieren, und die Datensaätze dann "Laden", stößt Du auf das nächte Problem: "Function can not be redeclared" oder so ähnlich...
Viel Spaß beim Experimentieren.
Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de
Tom