2012-06-02 17 views
8

Tengo el contenido de mi página guardado en una base de datos y me gustaría ejecutar cualquier código php en la cadena. Así que si mi cadena era:Ejecutar código PHP en una cadena

<h1>Welcome</h1><?php echo $motto?><br/> 

que sólo desea ejecutar echo $motto. Usando eval() intentará ejecutar <h1>Welcome</h1>.

¿Alguna forma de hacerlo?

+1

sí mantienen presentación y la lógica separada. Tener que hacer esto indicaría que es posible que desee replantear sus elecciones de diseño. – dm03514

+0

Por la forma en que está estructurando su sitio, puedo decirle ahora que esto causará problemas en el futuro. Aquí está mi sugerencia: use Smarty, o similar, para separar plantillas y códigos. – Hassan

+0

Parece que ha tomado una decisión de diseño realmente ** realmente ** mala. – PeeHaa

Respuesta

16

Agujas s decir que debe encontrar otra solución lo antes posible. En el ínterin se puede eval el código como el siguiente:

$str = '<h1>Welcome</h1><?php echo $motto?><br/>'; // Your DB content 

eval("?> $str <?php "); 

Demostración: http://codepad.org/ao2PPHN7

no puedo expresar lo suficiente: eval es peligroso, y el código de aplicación no debe estar en la base de datos. Pruebe un analizador de plantillas como Smarty, Dwoo, o mi favorito: Twig.

+2

... o simplemente 'eval ("?> $ Str ");' Solo tiene que saltar del bloque PHP. –

2

Usted realmente no debería hacer esto, pero si que sea absolutamente necesario, puede hacerlo mediante el uso de esta clase:

class PhpStringParser 
{ 
    protected $variables; 

    public function __construct($variables = array()) 
    { 
     $this->variables = $variables; 
    } 

    protected function eval_block($matches) 
    { 
     if(is_array($this->variables) && count($this->variables)) 
     { 
      foreach($this->variables as $var_name => $var_value) 
      { 
       $$var_name = $var_value; 
      } 
     } 

     $eval_end = ''; 

     if($matches[1] == '<?=' || $matches[1] == '<?php=') 
     { 
      if($matches[2][count($matches[2]-1)] !== ';') 
      { 
       $eval_end = ';'; 
      } 
     } 

     $return_block = ''; 

     eval('$return_block = ' . $matches[2] . $eval_end); 

     return $return_block; 
    } 

    public function parse($string) 
    { 
     return preg_replace_callback('/(\<\?=|\<\?php=|\<\?php)(.*?)\?\>/', array(&$this, 'eval_block'), $string); 
    } 
} 

Llámelo como esto:

$p = new PhpStringParser(); 
echo $p->parse($string); 

Fuente: http://www.php.net/manual/en/function.eval.php#108091

+0

El motivo por el que se guarda el cuerpo principal en una base de datos es para que el cliente pueda editarlo en un programa personalizado de Windows que he creado. Intento configurarlo de otra manera, pero mientras tanto, el sitio debe conectarse de esta manera. – bmandesign

+1

¿Qué beneficio tiene lo anterior en comparación con 'ob_start(); eval ("?> $ Str "); $ result = ob_get_clean();'? – goat

0

hacerse eco de cadena con una variable dentro de utilización:

echo "<h1>Welcome</h1>$motto<br/>" 

O incluso:

echo sprintf('<h1>Welcome</h1>%s<br/>', $motto) 

Aquí es una demostración http://codepad.org/f6aALD6w

Cuestiones relacionadas