2009-08-21 31 views
8

Tôi đang rối tung xung quanh với việc tạo khuôn mẫu và tôi đã gặp phải tình huống mà tôi cần phải lặp lại với trình duyệt mẫu chứa html & php. Làm cách nào để đánh giá PHP và gửi nó tới trình duyệt?PHP Eval đánh giá HTML & PHP

Vì vậy, đây là một ví dụ (main.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> 

Và sau đó trong template.php:

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

EDIT: template của tôi cũng cho phép bạn đưa dữ liệu từ bộ điều khiển Phong cách thông minh. Một bộ đệm đầu ra có cho phép tôi làm điều này và sau đó đánh giá php của tôi. Lý tưởng là nó thực hiện lần đầu tiên thông qua mã và đánh giá tất cả các thẻ trong lần đầu tiên, sau đó chạy php. Bằng cách này tôi có thể tạo ra các vòng lặp và các công cụ từ việc sử dụng dữ liệu được gửi từ bộ điều khiển của tôi.

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> 

Cảm ơn!

Trả lời

10

Sử dụng bộ đệm đầu ra để thay thế. eval() nổi tiếng chậm.

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> 

tập tin của bạn:

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

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

echo $contents; 

Sản lượng này sẽ là:

Lorem Ipsum

Lớn hơn 10!

+0

tôi làm sáng tỏ những gì mẫu của tôi không, sẽ vẫn hoạt động? – Matt

+0

Có, bạn có thể sử dụng các biến mà bạn đã khai báo trong mẫu. Tuy nhiên, bạn không thể sử dụng {$ title} như bạn đã làm - điều này sẽ chỉ hiển thị văn bản đó theo nghĩa đen. Bạn phải nói với mẫu đó là PHP. Tôi đã cập nhật câu trả lời của mình để chứng minh. –

+0

Câu trả lời này phải được chấp nhận! –

2

Không đọc tệp, nhưng bao gồm tệp và sử dụng bộ đệm đầu ra để ghi lại kết quả.

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

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

Sửa

Sử dụng một chức năng để tạo ra một phạm vi biến mới.

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

Hmm .. Tôi sẽ tiêm dữ liệu như thế nào? – Matt

+0

Bất kỳ số cách nào. Do chuỗi thay thế trên $ nội dung, làm cho globals có sẵn để main.php trước khi bao gồm nó, danh sách đi và về. –

+1

Tôi không nghĩ như vậy sẽ làm việc .. Bao gồm sẽ ném lỗi trước khi bạn có một cơ hội để làm chuỗi thay thế. – Matt

32

Trong trường hợp bạn đang cố gắng để làm điều này với một chuỗi các hỗn hợp HTML/PHP (như từ một cơ sở dữ liệu, như tôi đã được), bạn có thể làm theo cách này:

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

Thông tin thêm : http://blog.5ubliminal.com/posts/eval-for-inline-php-inside-html/ (lưu ý đây là một liên kết chết như của 2014-3-3)

+0

Cảm ơn bạn !!!!!! –

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

Để cải thiện chất lượng câu trả lời của bạn, vui lòng bao gồm cách/tại sao bài đăng của bạn sẽ giải quyết được vấn đề. –

1

giải pháp tốt nhất trong trường hợp của bạn là kết hợp evaloutput 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

Theo @Josh câu trả lời, cách đơn giản là:

eval('?>'.$htmlandphp);