Làm cách nào để lặp lại HTML trong PHP?


122

Tôi muốn xuất HTML có điều kiện để tạo một trang, vậy cách dễ nhất để lặp lại các đoạn mã đa dòng của HTML trong PHP 4+ là gì? Tôi có cần sử dụng khung mẫu như Smarty không?

echo '<html>', "\n"; // I'm sure there's a better way!
echo '<head>', "\n";
echo '</head>', "\n";
echo '<body>', "\n";
echo '</body>', "\n";
echo '</html>', "\n";

2
\ n không hoạt động trong html. Tôi đoán ý bạn là echo "<br>";
Weishi Zeng

Thực tế tốt nói để phân biệt logic của bạn khỏi chế độ xem (như trong MVC). sử dụng công cụ Templetig như Twig để tách chế độ xem của bạn khỏi logic tập lệnh - twig.sensiolabs.org Chèn triển khai đánh dấu html của bạn cho tập lệnh php của bạn làm theo cách khác. Thực hiện các biến php vào đền twig. Ngay sau khi bạn nhận được những gì tôi có nghĩa là bạn sẽ thấy lợi ích của cách tiếp cận này. Twig giải quyết loại vấn đề này. Đối với những đoạn mã nhỏ, bạn có thể viết phần mở rộng nhánh cây của riêng mình mà sau đó bạn có thể sử dụng với các đoạn mã để thực hiện một số nhiệm vụ phức tạp nhưng có tính thiết thực.
DevWL

Câu trả lời:


269

Có một số cách để lặp lại HTML trong PHP.

1. Ở giữa các thẻ PHP

<?php if(condition){ ?>
     <!-- HTML here -->
<?php } ?>

2. Trong một tiếng vang

if(condition){
     echo "HTML here";
}

Với echo, nếu bạn muốn sử dụng dấu ngoặc kép trong HTML của mình, bạn phải sử dụng dấu ngoặc kép đơn như sau:

echo '<input type="text">';

Hoặc bạn có thể thoát khỏi chúng như vậy:

echo "<input type=\"text\">";

3. Heredocs

4. Nowdocs (kể từ PHP 5.3.0)

Các công cụ mẫu được sử dụng để sử dụng PHP trong các tài liệu chứa chủ yếu là HTML. Trên thực tế, mục đích ban đầu của PHP là trở thành một ngôn ngữ tạo khuôn mẫu. Đó là lý do tại sao với PHP, bạn có thể sử dụng những thứ như thẻ ngắn để lặp lại các biến (ví dụ <?=$someVariable?>).

Có những công cụ mẫu khác (chẳng hạn như Smarty, Twig, v.v.) làm cho cú pháp thậm chí còn ngắn gọn hơn (ví dụ {{someVariable}}).

Lợi ích chính của việc sử dụng công cụ mẫu là giữ cho thiết kế ( logic trình bày ) tách biệt với mã hóa ( logic nghiệp vụ ). Nó cũng làm cho mã sạch hơn và dễ bảo trì hơn về lâu dài.

Nếu bạn có thêm bất kỳ câu hỏi nào hãy để lại bình luận.

Đọc thêm có sẵn về những điều này trong tài liệu PHP .


LƯU Ý: PHP ngắn thẻ <??>không được khuyến khích vì họ chỉ có sẵn nếu được kích hoạt với short_open_tagphp.ini chỉ thị tập tin cấu hình, hoặc nếu PHP đã được cấu hình với các --enable-short-tagstùy chọn. Chúng có sẵn, bất kể cài đặt từ 5.4 trở đi .


7
Không phải "/ * HTML ở đây * /" THỰC SỰ LÀ "<! - HTML here ->"? ;)
Jeremy Logan

Có trong bài viết đầu tiên bạn đã chính xác. Tôi đã bị cuốn vào mã haha. Cảm ơn bạn.
Chris Bier

1
Cảm ơn, @Chris B. nó đã giúp tôi. Với echo, nếu bạn muốn sử dụng dấu ngoặc kép trong HTML của mình, bạn phải sử dụng dấu ngoặc kép duy nhất như vậy: Tôi thực sự đã thiếu điều này.
Ayush Mishra

1
Liên kết đầu tiên này trong câu trả lời hiện đã bị xóa :(
mcon

Trên thực tế, các thẻ ngắn duy nhất có sẵn từ 5.4 trở đi là thẻ echo ngắn <?=$var?>. Các thẻ ngắn không được khuyến khích như thường lệ và sẽ bị loại bỏ ( <? doStuff() ?>).
igorsantos07

65

Hãy thử nó như thế này ( cú pháp heredoc ):

$variable = <<<XYZ
<html>
<body>

</body>
</html>
XYZ;
echo $variable;

8
@MhdSyrwan chars chỉ ngẫu nhiên, bạn có thể đọc thêm ở đây php.net/manual/en/...
lfx

1
quan tâm đến công phu? Tôi không thấy dấu ngoặc PHP mở hoặc đóng, nhưng cả HTML và PHP, vậy hả? - liên kết hoạt động và trả lời nó tốt hơn, nhưng có lẽ nó nên nằm trong văn bản câu trả lời sau đó, không phải trong các nhận xét?
Julix

@Julix tất nhiên bạn cần thêm thẻ mở và ( phụ thuộc ) đóng vào PHP. Anh ấy chỉ muốn làm cho ví dụ ngắn gọn.
Fahmi

Tôi hiểu rồi; bằng cách nào đó tôi đã bỏ lỡ đây là cú pháp heredocs (tức là toàn bộ mã là php). Tôi cảm thấy bối rối, vì tôi mới làm quen với PHP vào thời điểm đó và thường thấy các cú pháp như <?php $variable = "bla"; ?> <html> <body class="<?php echo $variable ?>"> </body> </html>--- Vì vậy, tôi nghĩ rằng một loạt các dấu ngoặc nhọn bị thiếu và không chắc chúng sẽ đi đâu. Thật buồn cười khi những nhận xét hơi cũ của tôi được trả lời, vì lúc đó tôi còn rất mới.
Julix

30

Bạn có thể sử dụng cú pháp thay thế cú pháp thay thế cho cấu trúc điều khiển và thoát khỏi PHP:

<?php if ($something): ?>
    <some /> <tags /> <etc />
    <?=$shortButControversialWayOfPrintingAVariable ?>
    <?php /* A comment not visible in the HTML, but it is a bit of a pain to write */ ?>
<?php else: ?>
    <!-- else -->
<?php endif; ?>

@Jeremy: Đây có lẽ là cách tốt nhất, trực tiếp nhất giả sử bạn không tìm kiếm thêm thứ gì đó ... Bạn đang tìm kiếm thứ gì đó khác?
Frank V

1
Có, cụ thể là khả năng sử dụng các bình luận PHP giữa HTML, các bình luận sẽ không được lặp lại.
TheFlash

15

Về cơ bản, bạn có thể đặt HTML ở bất kỳ đâu bên ngoài các thẻ PHP. Nó cũng rất có lợi khi thực hiện tất cả các xử lý dữ liệu cần thiết của bạn trước khi hiển thị bất kỳ dữ liệu nào, để tách logic và trình bày.

Bản thân phần hiển thị dữ liệu có thể nằm ở cuối cùng một tệp PHP hoặc bạn có thể bao gồm một tệp PHP riêng biệt bao gồm chủ yếu là HTML.

Tôi thích phong cách nhỏ gọn này:

<?php
    /* do your processing here */
?>

<html>
<head>
    <title><?=$title?></title>
</head>
<body>
    <?php foreach ( $something as $item ) : ?>
        <p><?=$item?></p>
    <?php endforeach; ?>
</body>
</html>

Lưu ý: bạn có thể cần sử dụng <?php echo $var; ?>thay vì <?=$var?>tùy thuộc vào thiết lập PHP của mình.


7

Tôi là một phần của phong cách này:

  <html>
    <head>
<%    if (X)
      {
%>      <title>Definitely X</title>
<%    }
      else
      {
%>      <title>Totally not X</title>
<%    }
%>  </head>
  </html>

Tôi sử dụng thẻ kiểu ASP, vâng. Sự pha trộn giữa PHP và HTML trông rất dễ đọc đối với mắt tôi. Bí quyết là lấy đúng <%%>đánh dấu.


Các thẻ ASP có tương thích với PHP 4+ không?
TheFlash

4
Có nhưng hãy lấy chúng trong khi chúng còn cuối cùng - chúng đang bị xóa khỏi PHP (không chắc phiên bản nào ... nếu chúng chưa chạy)
Greg

7

Một cách tiếp cận khác là đặt HTML trong một tệp riêng biệt và đánh dấu khu vực cần thay đổi bằng trình giữ chỗ [[nội dung]] trong trường hợp này. (Bạn cũng có thể sử dụng sprintf thay vì str_replace.)

$page = 'Hello, World!';
$content = file_get_contents('html/welcome.html');
$pagecontent = str_replace('[[content]]', $content, $page);
echo($pagecontent);

Ngoài ra, bạn có thể chỉ xuất tất cả nội dung PHP ra màn hình được chụp trong bộ đệm, viết HTML và đưa đầu ra PHP trở lại trang.

Có vẻ lạ khi viết PHP ra, bắt nó và sau đó viết lại, nhưng nó có nghĩa là bạn có thể thực hiện tất cả các loại công cụ định dạng ( heredoc , v.v.) và kiểm tra kết quả đầu ra một cách chính xác mà không gặp rắc rối về trang mẫu cản trở. ( Joomla CMS thực hiện theo cách này, BTW.)

I E:

<?php
    ob_start();
    echo('Hello, World!');
    $php_output = ob_get_contents();
    ob_end_clean();
?>
<h1>My Template page says</h1>
<?php
    echo($php_output);
?>
<hr>
Template footer

2

Chỉ cần sử dụng hàm in để lặp lại văn bản trong tệp PHP như sau:

<?php

  print('
    <div class="wrap">

      <span class="textClass">TESTING</span>

    </div>
  ')
?>

2
$enter_string = '<textarea style="color:#FF0000;" name="message">EXAMPLE</textarea>';

echo('Echo as HTML' . htmlspecialchars((string)$enter_string));

1

Ngoài câu trả lời của Chris B , nếu bạn vẫn cần sử dụng echo, vẫn muốn giữ cho nó đơn giản và có cấu trúc và không muốn spam mã với <?php stuff; ?>'s, bạn có thể sử dụng cú pháp bên dưới.

Ví dụ bạn muốn hiển thị hình ảnh của một thư viện:

foreach($images as $image)
{
    echo
    '<li>',
        '<a href="', site_url(), 'images/', $image['name'], '">',
            '<img ',
                'class="image" ',
                'title="', $image['title'], '" ',
                'src="', site_url(), 'images/thumbs/', $image['filename'], '" ',
                'alt="', $image['description'], '"',
            '>',
        '</a>',
    '</li>';
}

Echo có nhiều tham số nên với việc thụt lề tốt, nó trông khá đẹp. Ngoài ra việc sử dụng echovới các tham số sẽ hiệu quả hơn so với ghép nối.


1
echo '
<html>
<body>
</body>
</html>
';

hoặc là

echo "<html>\n<body>\n</body>\n</html>\n";

1

Thử cái này:

<?php
    echo <<<HTML

    Your HTML tags here

HTML;
?>

0

Đừng lặp lại HTML.

Nếu bạn muốn sử dụng

<?php echo "<h1>  $title; </h1>"; ?>

bạn nên làm điều này:

<h1><?= $title;?></h1>

-1

Đây là cách tôi làm điều đó:

<?php if($contition == true){ ?>
         <input type="text" value="<?php echo $value_stored_in_php_variable; ?>" />
<?php }else{ ?>
         <p>No input here </p>
<?php } ?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.