PHP Conference Japan 2024

從 HTML 跳脫

PHP 解析器會忽略一對開始和結束標籤之外的所有內容,這使得 PHP 檔案可以包含混合內容。例如,這允許 PHP 嵌入 HTML 文件中以建立樣板。

<p>這部分將被 PHP 忽略並由瀏覽器顯示。</p>
<?php echo '而這部分將被解析。'; ?>
<p>這部分也將被 PHP 忽略並由瀏覽器顯示。</p>
這樣可以正常運作,因為當 PHP 直譯器遇到 ?> 結束標籤時,它會簡單地開始輸出它找到的任何內容(除了緊接著的換行符號 - 請參閱 指令分隔),直到它遇到另一個開始標籤,除非是在條件語句的中間,在這種情況下,直譯器將會先判斷條件的結果,然後再決定要跳過哪些內容。請參閱下一個範例。

使用帶有條件的結構

範例 #1 使用條件的高級跳脫

<?php if ($expression == true): ?>
如果表達式為真,則會顯示此內容。
<?php else: ?>
否則會顯示此內容。
<?php endif; ?>
在此範例中,即使條件區塊位於 PHP 開啟/關閉標籤之外,PHP 也會跳過不符合條件的區塊;由於 PHP 直譯器會跳過不符合條件的區塊,因此 PHP 會根據條件跳過它們。

對於輸出大量文字而言,退出 PHP 解析模式通常比透過 echoprint 傳送所有文字更有效率。

注意:

如果 PHP 嵌入在 XML 或 XHTML 中,則必須使用標準的 PHP <?php ?> 標籤以保持相容性。

新增註釋

使用者貢獻的註釋 3 則註釋

quickfur at quickfur dot ath dot cx
14 年前
當文件說明 PHP 解析器會忽略 <?php ... ?> 標籤之外的所有內容時,它的意思是「所有內容」。包含您通常不會認為「有效」的內容,例如以下範例

<html><body>
<p<?php if ($highlight): ?> class="highlight"<?php endif;?>>這是一個段落。</p>
</body></html>

請注意 PHP 程式碼是如何嵌入在 HTML 開啟標籤中間的。PHP 解析器並不關心它位於開頭標籤的中間,也不要求它必須被關閉。它也不關心關閉 ?> 標籤之後是 HTML 開啟標籤的結尾。因此,如果 $highlight 為真,則輸出將會是

<html><body>
<p class="highlight">這是一個段落。</p>
</body></html>

否則,它將會是

<html><body>
<p>這是一個段落。</p>
</body></html>

使用此方法,您可以根據某些 PHP 條件,讓 HTML 標籤具有可選的屬性。非常靈活且實用!
ravenswd at gmail dot com
15 年前
您需要注意 PHP 的一個方面,那就是即使 ?> 出現在 // 註釋中,它也會讓您退出 PHP 程式碼並進入 HTML。(這不適用於 /* */ 註釋。)這可能會導致意外的結果。例如,以下這行

<?php
$file_contents
= '<?php die(); ?>' . "\n";
?>

如果您嘗試透過將其轉換為註釋來移除它,您會得到以下結果

<?php
// $file_contents = '<?php die(); ?>' . "\n";
?>

這會導致 ' . "\n";(以及後續行中的任何內容)輸出到您的 HTML 頁面。

解決方法是使用 /* */ 標籤將其註釋掉,或將該行改寫為

<?php
$file_contents
= '<' . '?php die(); ?' . '>' . "\n";
?>
sgurukrupa at gmail dot com
10 年前
雖然正文中沒有特別指出,但 HTML 跳脫也適用於其他控制語句

<?php for ($i = 0; $i < 5; ++$i): ?>
Hello, there!
<?php endfor; ?>

執行上述程式碼片段時,會得到以下輸出

Hello, there!
Hello, there!
Hello, there!
Hello, there!
To Top