2009-08-21 25 views
8

का मूल्यांकन करता है मैं templating के साथ गड़बड़ कर रहा हूं और मैंने ऐसी परिस्थिति में भाग लिया है जहां मुझे ब्राउजर को प्रतिबिंबित करने की आवश्यकता है जिसमें HTML & php शामिल है। मैं PHP का मूल्यांकन कैसे करूं और ब्राउज़र पर भेजूं?PHP Eval जो एचटीएमएल और PHP

<div id = "container"> 
     <div id="head"> 
      <?php if ($id > 10): ?> 
       <H3>Greater than 10!</H3> 
      <?php else: ?> 
       <H3>Less than 10!</H3> 
      <?php endif ?> 
     </div> 
      </div> 

और फिर template.php में:

तो यहाँ

एक उदाहरण (main.php) है

<?php 
      $contents; // Contains main.php in string format 
      echo eval($contents); // Doesn't work... How do I do this line?? 
    ?> 

संपादित करें: मेरे टेम्पलेट भी आप नियंत्रक से डेटा इंजेक्षन करने की अनुमति देता चतुर शैली। क्या आउटपुट बफर मुझे ऐसा करने की अनुमति देगा और फिर मेरे PHP का मूल्यांकन करेगा। आदर्श यह है कि यह कोड के माध्यम से पहला-पास करता है और पहले सभी टैग का मूल्यांकन करता है, फिर PHP चलाता है। इस तरह से मैं अपने नियंत्रक से भेजे गए डेटा का उपयोग करने से लूप और सामान बना सकता हूं।

So maybe a more complete example: 
    <div id = "container"> 
      <div id = "title">{$title}</div> <!-- This adds data sent from a controller --> 
      <div id="head"> 
       <?php if ($id > 10): ?> 
        <H3>Greater than 10!</H3> 
       <?php else: ?> 
        <H3>Less than 10!</H3> 
       <?php endif ?> 
      </div> 
    </div> 

धन्यवाद!

उत्तर

10

इसके बजाय आउटपुट बफरिंग का उपयोग करें। eval() कुख्यात रूप से धीमा है।

main.php:

<div id="container"> 
    <div id="title"><?php echo $title; ?></div><!-- you must use PHP tags so the buffer knows to parse it as such --> 
    <div id="head"> 
     <?php if ($id > 10): ?> 
      <H3>Greater than 10!</H3> 
     <?php else: ?> 
      <H3>Less than 10!</H3> 
     <?php endif ?> 
    </div> 
</div> 

आपकी फ़ाइल:

$title = 'Lorem Ipsum'; 
$id = 11; 

ob_start(); 
require_once('main.php'); 
$contents = ob_get_contents(); 
ob_end_clean(); 

echo $contents; 

इस के उत्पादन में हो जाएगा:

Lorem Ipsum

10 से अधिक महान!

+0

मैं स्पष्ट किया कि मेरी टेम्पलेट करता है, यह अभी भी काम करेगा? – Matt

+0

हां, आप उन चरों का उपयोग कर सकते हैं जिन्हें आपने टेम्पलेट में पहले ही घोषित कर दिया है। हालांकि, आप {$ title} का उपयोग नहीं कर सकते जैसा आपने किया - यह केवल उस पाठ को शाब्दिक रूप से दिखाएगा। आपको टेम्पलेट को बताना होगा कि वह PHP है। मैंने प्रदर्शन करने के लिए अपना जवाब अपडेट कर दिया है। –

+0

यह उत्तर स्वीकार किया जाना चाहिए! –

2

फ़ाइल को न पढ़ें, लेकिन इसे शामिल करें और परिणाम कैप्चर करने के लिए आउटपुट बफरिग का उपयोग करें।

ob_start(); 
include 'main.php'; 
$content = ob_get_clean(); 

// process/modify/echo $content ... 

संपादित

उपयोग एक समारोह एक नया वेरिएबल गुंजाइश उत्पन्न करने के लिए।

eval(' ?>'.$htmlandphp.'<?php '); 

और जानकारी:

function render($script, array $vars = array()) 
{ 
    extract($vars); 

    ob_start(); 
    include $script; 
    return ob_get_clean(); 
} 

$test = 'one'; 
echo render('foo.php', array('test' => 'two')); 
echo $test; // is still 'one' ... render() has its own scope 
+0

हम्म .. फिर मैं डेटा कैसे इंजेक्ट करूं? – Matt

+0

किसी भी तरीके से। स्ट्रिंग को $ सामग्री पर बदल देता है, इसमें शामिल होने से पहले main.php पर ग्लोबल उपलब्ध कराते हैं, सूची चालू होती है। –

+1

मुझे नहीं लगता कि इस प्रकार काम करेगा .. स्ट्रिंग प्रतिस्थापन करने का मौका मिलने से पहले त्रुटि शामिल करें। – Matt

32

मामले में आप (के रूप में मैं था, एक डेटाबेस से की तरह) मिश्रित HTML/PHP के एक स्ट्रिंग के साथ ऐसा करने की कोशिश कर रहे हैं, आप इसे इस तरह से कर सकते हैं : http://blog.5ubliminal.com/posts/eval-for-inline-php-inside-html/ (ध्यान दें कि यह 2014/03/03 के रूप में एक मरे हुए लिंक है)

+0

धन्यवाद !!!!!! –

1
$contents = htmlentities($contents); 
echo html_entity_decode(eval($contents)); 
+2

अपने उत्तर की गुणवत्ता में सुधार करने के लिए, कृपया अपनी पोस्ट समस्या को हल करने के लिए/क्यों शामिल करें। –

1

आपके मामले में सबसे अच्छा समाधान eval और output buffer

गठबंधन करने के लिए है
// read template into $contents 
// replace {title} etc. in $contents 
$contents = str_replace("{title}", $title, $contents); 
ob_start(); 
    eval(" ?>".$contents."<?php "); 
$html .= ob_get_clean(); 
echo html; 
0

@Josh जवाब के अनुसार, सरल तरीका है:

eval('?>'.$htmlandphp); 
संबंधित मुद्दे