eval nasıl () bir dize bir segment

3 Cevap php

Ben HTML & olan bir dize var Ben veritabanından dize çektiğinizde PHP içinde, bu ekrana echo'd, ancak PHP kodu görüntüler değil. Dizesi aşağıdaki gibi görünür:

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

Output

   Hello

Source Code

   Hello <?php echo 'World';?>

Ben kaynak kodu baktığınızda, orada php çizgi görebilirsiniz. Peki ne yapmam gerekiyor eval () dize sadece php bölümdür.

Düşünün bir şey PHP herhangi bir zamanda dizede herhangi bir yer olabilir olmasıdır.

* Just to clarify, my PHP config is correct, this is a case of some PHP being dumped from the database and not rendering, because I am echo'ing a variable with the PHP code in it, it fails to run. *

Tekrar teşekkürler herhangi bir yardım için ben alabilirsiniz.

3 Cevap

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

$matches = array();

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

eval($matches[1]);

Bu çalışacaktır, ama diğerleri var ve önerecektir gibi, bu korkunç bir fikir. Sizin uygulama mimarisi veritabanında kod saklamak etrafında asla.

Her zaman dizeleri görüntülemek için gereken sayfalar varsa en basit, bunları üretmek için veritabanı, kod değil bu dizeleri depolamak. Gerçek dünya veriler bu daha karmaşık, ama her zaman düzgün bir veritabanında modellenmiştir olmalıdır.

Edit: kaynağını kaldırmak için preg_replace_callback ile uyum gerekir miydi / doğru sokmak.

Sen sadece çalıştırın, php kodu eval olmamalıdır. Bu php tercüman yüklü olması gerekir, ve apache + php düzgün yapılandırılmış. Sonra bu. Php dosya çıktı Hello World gerekir.

Answer to the edit: Use preg_replace_callback to get the php part, eval it, replace the input to the output, then echo it. But. If you should eval things come from database, i'm almost sure, it's a design error.

eval () olarak uzun kod uygun PHP ve bir noktalı virgül ile biter gibi, düzgün çalışması gerekir. Nasıl ilk php etiketini kapalı şerit hakkında, sonra eval.

Aşağıdaki örnek, test edilmiş ve çalışır edilmiştir:

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

Sadece aslında kod çalıştırmak için, db içine içerik alabilirsiniz kimseye izin konum beri ne olursa olsun db almak düzgün, ilk sterilize edilmiş olduğundan emin olun.