2009-06-21 5 views
0

Ich habe eine Zeichenfolge, die HTML & PHP in es hat, wenn ich die Zeichenfolge aus der Datenbank ziehen, wird Echo auf Bildschirm, aber der PHP-Code wird nicht angezeigt . Der String sieht wie folgt aus:wie zu eval() ein Segment einer Zeichenfolge

$string = 'Hello <?php echo 'World';?>'; 
    echo $string; 

Ausgabe

Hello 

Source Code

Hello <?php echo 'World';?> 

Als ich in den Quellcode schauen, kann ich die PHP-Linie dort sehen. Also was ich tun muss, ist Eval() nur das PHP-Segment, das in der Zeichenfolge ist.

Eine Sache, die man beachten sollte, ist, dass PHP jederzeit irgendwo in der Zeichenkette stehen kann.

* Nur um zu klären, meine PHP-Konfiguration korrekt ist, ist dies ein Fall von einigen aus der Datenbank abgeladen PHP ist und nicht Rendering, weil ich darin eine Variable mit dem PHP-Code bin echo'ing, scheitert es an Lauf. *

Nochmals vielen Dank für jede Hilfe, die ich erhalten kann.

+0

Konnten Sie die php Linie in der Ausgangsquelle sehen? – erenon

+0

Ja, wie ich schon erwähnt habe ist das PHP in der Quelle. – Tisch

+0

Ich klärte den Code etwas auf um das Problem etwas besser zu illustrieren ... – Tisch

Antwort

4
$str = "Hello 
<?php echo 'World';?>"; 

$matches = array(); 

preg_match('/<\?php (.+) \?>/x', $str, $matches); 

eval($matches[1]); 

Dies wird funktionieren, aber wie andere haben und werden vorschlagen, das ist eine schreckliche Idee. Ihre Anwendungsarchitektur sollte sich niemals darauf konzentrieren, Code in der Datenbank zu speichern.

Am einfachsten, wenn Sie Seiten haben, die immer Zeichenfolgen anzeigen müssen, speichern Sie diese Zeichenfolgen in der Datenbank, nicht Code, um sie zu erzeugen. Daten aus der realen Welt sind komplizierter als diese, müssen aber immer korrekt in der Datenbank modelliert werden.

Edit: Würde mit preg_replace_callback anpassen müssen, um die Quelle zu entfernen/richtig interpolieren.

+0

Das ist ein Vergnügen behandelt. Vielen Dank. Ich denke, ich werde neu überdenken, wie ich mein Projekt auf diesen Rat hin strukturiere. – Tisch

+0

Gerne helfen. Etwas wie Erenons Vorschlag klingt gut. Wenn Sie eine dynamische Funktionalität in Ihren Blöcken haben möchten, z. B. das Anzeigen einer Entität, sollten Sie in Erwägung ziehen, einen Marker/BBCode in den HTML-Code einzufügen und ihn durch String/Regex-Ersatzfunktionen zu ersetzen –

0

Sie sollten den PHP-Code nicht überprüfen, einfach ausführen. Es muss PHP-Interpreter installiert und Apache + PHP richtig konfiguriert sein. Dann sollte diese .php-Datei Hello World ausgeben.

Antwort auf die edit: Verwenden preg_replace_callback den PHP-Teil zu bekommen, eval es, ersetzen Sie den Eingang zum Ausgang, Echo es dann. Aber. Wenn Sie Eval Dinge aus der Datenbank kommen, bin ich mir fast sicher, es ist ein Designfehler.

+0

Danke, aber das ist nicht der Fall, da die Zeile von PHP in der Zeichenfolge ist ... und ich habe eine Variable, in der die Zeichenfolge gespeichert ist. Wenn ich die Variable zum Bildschirm echo, echo ist der rohe PHP-Code auch ... – Tisch

+0

Antwort auf den zweiten Teil Antwort: Danke, ich werde dies versuchen. Sie werden wahrscheinlich über den Designfehler schreiben! Es ist ein persönliches Projekt von mir, also ist alles mein eigenes Design ... was höchstwahrscheinlich falsch ist! Aber du lebst und lernst :) – Tisch

+0

Behalte den Code in den PHP-Quelldateien und den Inhalt in der Datenbank. Sie können z.B. BBCode Tags in die Datenbank gespeicherte Inhalte und analysieren sie, aber es ist nicht zu empfehlen, PHP-Codes und Inhalte zu mischen. Es ist fehleranfällig, macht Sicherheitsprobleme, ist schlecht in der Leistung, schwer zu warten usw. Trennen Sie den Code und den Inhalt. Je mehr über das konkrete Problem, desto mehr kann ich helfen. – erenon

0

eval() sollte gut funktionieren, solange der Code PHP korrekt ist und mit einem Semikolon endet. Wie wäre es, wenn Sie zuerst das PHP-Tag entfernen und es dann auswerten?

wurde Das folgende Beispiel getestet und funktioniert:

<?php 
$db_result = "<?php echo 'World';?>"; 
$stripped_code = str_replace('?>', '', str_replace('<?php', '', $db_result)); 
eval($stripped_code); 
?> 

nur sicherstellen, dass alles, was Sie von der db abrufen zuerst korrekt desinfiziert wurde, sind da Sie im Wesentlichen so dass jeder die Inhalte in die db bekommen, Code ausführen.