2012-06-02 10 views
8

मेरे पास मेरी पृष्ठ सामग्री डेटाबेस में सहेजी गई है और स्ट्रिंग में किसी भी PHP कोड को निष्पादित करना चाहूंगा। तो अगर मेरे स्ट्रिंग यह थी:स्ट्रिंग में PHP कोड निष्पादित करें

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

मैं केवल echo $motto निष्पादित करने के लिए चाहते हैं। Eval() का उपयोग करने से <h1>Welcome</h1> निष्पादित करने का प्रयास किया जाएगा।

ऐसा करने का कोई तरीका?

+1

हाँ प्रस्तुति और तर्क अलग रखना है। ऐसा करने से यह संकेत मिलेगा कि आप अपने डिज़ाइन विकल्पों पर पुनर्विचार करना चाहेंगे। – dm03514

+0

जिस तरह से आप अपनी साइट का निर्माण कर रहे हैं, मैं आपको अभी बता सकता हूं कि यह लाइन के नीचे समस्याएं पैदा करेगा। यहां मेरा सुझाव दिया गया है: टेम्पलेट्स और कोड को अलग करने के लिए Smarty, या इसी तरह का उपयोग करें। – Hassan

+0

ऐसा लगता है कि आपने वास्तव में ** वास्तव में ** खराब डिज़ाइन निर्णय लिया है। – PeeHaa

उत्तर

16

सुई कहने के लिए आपको एक और समाधान ASAP मिलना चाहिए। इस बीच में आप इस तरह कोड eval कर सकते हैं:

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

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

डेमो: http://codepad.org/ao2PPHN7

मैं नहीं बता सकता कि वह पर्याप्त: eval खतरनाक है, और आवेदन कोड डेटाबेस में नहीं होना चाहिए। Smarty, Dwoo, या मेरे पसंदीदा: Twig जैसे टेम्पलेट पार्सर आज़माएं।

+2

... या बस 'eval ("?> $ Str");' आपको बस PHP ब्लॉक से बाहर निकलना होगा। –

2

आप वास्तव में ऐसा नहीं करना चाहिए, लेकिन अगर आप पूरी तरह से करने के लिए है, तो आप इसे इस वर्ग का उपयोग करके कर सकते हैं:

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

इसे इस तरह कॉल करें:

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

स्रोत: http://www.php.net/manual/en/function.eval.php#108091

+0

डेटाबेस में मुख्य निकाय को सहेजने का कारण यह है कि ग्राहक इसे मेरे द्वारा बनाए गए कस्टम विंडोज प्रोग्राम में संपादित कर सकता है। मैं इसे अलग-अलग सेट करने की कोशिश कर रहा हूं लेकिन इस समय साइट को इस तरह ऑनलाइन जाना होगा। – bmandesign

+1

उपरोक्त की तुलना 'ob_start(); eval ("?> $ Str ") से की गई है; $ परिणाम = ob_get_clean();'? – goat

0

उपयोग के अंदर एक चर के साथ स्ट्रिंग गूंज के लिए:

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

या भी:

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

यहाँ एक डेमो http://codepad.org/f6aALD6w

संबंधित मुद्दे