como eval () um segmento de uma string
Pergunta
Eu tenho uma seqüência que tenha HTML e PHP nele, quando eu puxar a corda do banco de dados, é echo'd para a tela, mas o código PHP não será exibido. Os olhares de cordas como este:
$string = 'Hello <?php echo 'World';?>';
echo $string;
saída
Hello
Código Fonte
Hello <?php echo 'World';?>
Quando eu olhar no código fonte, posso ver a linha php lá. Então, o que eu preciso fazer é eval) apenas o segmento (php que está na corda.
Uma coisa a considerar é que o PHP pode ser localizado em qualquer lugar na string em um dado momento.
* Só para esclarecer, meu PHP configuração estiver correta, este é um caso de algum PHP ser despejado do banco de dados e não renderização, porque estou echo'ing uma variável com o código PHP nele, ele falhar para correr. *
Obrigado novamente por qualquer ajuda que pode receber.
Solução
$str = "Hello
<?php echo 'World';?>";
$matches = array();
preg_match('/<\?php (.+) \?>/x', $str, $matches);
eval($matches[1]);
Este trabalho vontade, mas como outros têm e irão sugerir, esta é uma péssima idéia. Sua arquitetura de aplicação nunca deve girar em torno de armazenamento de código no banco de dados.
A maioria simplesmente, se você tiver páginas que sempre precisam de cadeias de exibição, armazenar essas cordas no banco de dados, não o código para produzi-los. dados do mundo real é mais complicado do que isso, mas deve sempre ser devidamente modeladas no banco de dados.
Edit:. Precisaria adaptar com preg_replace_callback para remover a fonte / interpolate corretamente
Outras dicas
Você não deve eval o código php, basta executá-lo. É da necessidade de ser intérprete PHP instalado, e apache + php configurado corretamente. Então este .php deve saída Olá Mundo.
Resposta ao edit: Use preg_replace_callback para obter a parte php, eval-lo, substituir a entrada para a saída, então eco-lo. Mas. Se você deve eval coisas vêm de banco de dados, tenho quase certeza, é um erro de projeto.
eval () deve funcionar bem, contanto que o código é PHP adequada e termina com um ponto e vírgula. Que tal você retirar o tag php primeiro, então eval-lo.
O exemplo a seguir foi testado e funciona:
<?php
$db_result = "<?php echo 'World';?>";
$stripped_code = str_replace('?>', '', str_replace('<?php', '', $db_result));
eval($stripped_code);
?>
Apenas certifique-se que tudo o que você recuperar a partir do db foi devidamente higienizados em primeiro lugar, desde que você está permitindo essencialmente qualquer um que pode obter conteúdo para o db, para executar código.