2012-06-02 15 views
8

Mam zawartość strony zapisaną w bazie danych i chciałbym wykonać dowolny kod php w ciągu. Więc jeśli mój ciąg był:Wykonywanie kodu PHP w ciągu znaków

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

Chcę tylko wykonać echo $motto. Użycie eval() spróbuje wykonać <h1>Welcome</h1>.

Jakikolwiek sposób to zrobić?

+1

tak trzymać prezentacji i logiki indywidualne. Konieczność wykonania tego oznaczałoby, że warto przemyśleć swoje wybory dotyczące projektu. – dm03514

+0

Sposób, w jaki budujesz swoją witrynę, mogę teraz powiedzieć, że spowoduje to problemy w dół. Oto moja sugestia: użyj Smarty lub podobnego, aby oddzielić szablony i kod. – Hassan

+0

Wygląda na to, że podjąłeś naprawdę poważną decyzję. – PeeHaa

Odpowiedz

16

Igły s powiedzieć, że powinieneś znaleźć inne rozwiązanie JAK NAJSZYBCIEJ. W międzyczasie można eval kodu tak:

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

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

Demo: http://codepad.org/ao2PPHN7

nie mogę podkreślić, że wystarczy: eval jest niebezpieczna, a kod aplikacji nie powinna być w bazie. Wypróbuj parser szablonów, taki jak Smarty, Dwoo lub mój ulubiony: Twig.

+2

... lub po prostu 'eval ("?> $ Str ");' Musisz tylko wyskoczyć z bloku PHP. –

2

You naprawdę nie powinien tego robić, ale jeśli koniecznie musisz, możesz to zrobić za pomocą tej klasy:

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); 
    } 
} 

Nazwijmy to tak:

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

Źródło: http://www.php.net/manual/en/function.eval.php#108091

+0

Powód, dla którego główna treść jest zapisana w bazie danych, umożliwia klientowi jej edycję w niestandardowym programie systemu Windows, który wykonałem. Próbuję skonfigurować go inaczej, ale w międzyczasie witryna musi być online. – bmandesign

+1

Jakie są korzyści powyższe w porównaniu do 'ob_start(); eval ("?> $ Str "); $ result = ob_get_clean();'? – goat

0

Aby echo ciąg o zmiennej wewnątrz użytku:

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

lub nawet:

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

Oto demo http://codepad.org/f6aALD6w

Powiązane problemy