首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP htmlentities() 函數深度解析與實戰指南

     編輯:PHP 綜合知識

函數作用

htmlentities() 將字符串中所有可轉換的字符轉為對應的 HTML 實體,防止 XSS 攻擊並確保頁面正確渲染。逆向操作使用 html_entity_decode()。

語法與參數詳解

htmlentities(string $string, int $flags = ENT_COMPAT | ENT_HTML401, string $encoding = 'UTF-8', bool $double_encode = true): string

參數說明

參數說明
$string必需。待轉換的字符串。
$flags可選。控制引號處理、無效編碼策略及文檔類型。常用組合:
ENT_QUOTES | ENT_HTML5(推薦現代項目)
$encoding可選。字符集,默認 UTF-8。常用:UTF-8, ISO-8859-1, GB2312, BIG5。
$double_encode可選。true(默認)轉換所有實體;false 跳過已存在的實體。

Flags 常量分組

引號處理

  • ENT_COMPAT:默認,僅轉換雙引號。
  • ENT_QUOTES:轉換雙引號和單引號(推薦)。
  • ENT_NOQUOTES:不轉換任何引號。

無效編碼處理

  • ENT_IGNORE:忽略無效編碼(不推薦,有安全風險)。
  • ENT_SUBSTITUTE:替換為 Unicode 替代字符 U+FFFD。
  • ENT_DISALLOWED:替換指定文檔類型中的無效碼點。

文檔類型聲明

  • ENT_HTML401:默認,HTML 4.01 模式。
  • ENT_HTML5:HTML5 模式(推薦現代項目)。
  • ENT_XML1:XML 1 模式。
  • ENT_XHTML:XHTML 模式。

實戰示例

示例 1:引號處理差異

<?php
$str = "Bill & 'Steve'";
echo htmlentities($str, ENT_COMPAT);   // 僅雙引號: Bill &amp; 'Steve'
echo "<br>";
echo htmlentities($str, ENT_QUOTES);   // 雙引號+單引號: Bill &amp; 'Steve'
echo "<br>";
echo htmlentities($str, ENT_NOQUOTES); // 不轉換引號: Bill &amp; 'Steve'
?>

示例 2:指定字符集處理特殊字符

<?php
$str = "My name is Øyvind Åsane. I'm Norwegian.";
echo htmlentities($str, ENT_QUOTES, "ISO-8859-1");
// 輸出: My name is &Oslash;yvind &Aring;sane. I'm Norwegian.
?>

示例 3:防 XSS 最佳實踐

function h($string) {
    return htmlentities($string, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
}

// 使用
echo '<div class="user-input">' . h($_POST['comment']) . '</div>';

版本演進重點

  • PHP 5.4:默認編碼從 ISO-8859-1 改為 UTF-8;新增 ENT_SUBSTITUTE, ENT_DISALLOWED, ENT_HTML401, ENT_HTML5, ENT_XML1, ENT_XHTML。
  • PHP 5.3:新增 ENT_IGNORE。
  • PHP 5.2.3:新增 double_encode 參數。
  • PHP 4.1:新增 character-set 參數。

常見誤區與建議

  1. 不要用於數據庫存儲: 入庫前應保存原始數據,輸出到 HTML 時再轉義。
  2. 區別 htmlspecialchars(): 後者僅轉換 & " ' < > 五個字符,性能更高,大多數場景足夠。
  3. 編碼一致性: 確保頁面 <meta charset="UTF-8">、PHP 文件編碼、數據庫連接編碼三者一致。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved