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

PHP html_entity_decode() 完整指南:HTML 實體反轉字符、編碼處理、配套函數對比

     編輯:PHP 綜合知識

html_entity_decode() 是 htmlentities() 的逆操作:**將 HTML 實體 (如 `<`, `"`, `〹`) 還原為原始字符**。本文詳解參數、編碼處理、常見陷阱、配套函數對比。

函數簽名

html_entity_decode(string $string, int $flags = ENT_COMPAT | ENT_HTML401, string $encoding = ini_get("default_charset")): string

參數詳解

參數類型說明
$stringstring包含 HTML 實體的字符串
$flagsint引號處理方式 + 文檔類型 (見下表)
$encodingstring字符編碼,**強烈建議顯式指定 'UTF-8'**

$flags 常量組合

常量值行為
ENT_COMPAT默認僅轉換雙引號 ",單引號 ' 保持
ENT_QUOTES轉換雙引號和單引號 (推薦)
ENT_NOQUOTES不轉換任何引號
ENT_HTML401默認HTML 4.01 標準實體
ENT_XML1XML 實體集
ENT_HTML5HTML5 實體集 (含更多命名實體)

組合用法:ENT_QUOTES | ENT_HTML5

支持的編碼 (PHP 5.6+ 默認 UTF-8)

ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, KOI8-R, GB2312, BIG5, BIG5-HKSCS, Shift_JIS, EUC-JP, MacRoman, ...

最佳實踐:始終顯式傳遞 `'UTF-8'`**,避免 `default_charset` 配置不一致導致亂碼。

實戰代碼示例

<?php
// 原始字符串
$original = '--> "E.V-Get.com" <--';

// 1. htmlentities() 編碼 (實體化)
$encoded = htmlentities($original, ENT_QUOTES, 'UTF-8');
// $encoded = '--> "E.V-Get.com" <--'

// 2. html_entity_decode() 解碼 (還原)
// 完整還原
$decoded = html_entity_decode($encoded, ENT_QUOTES, 'UTF-8');
// $decoded = '--> "E.V-Get.com" <--'

// 僅解碼雙引號 (默認 ENT_COMPAT)
$decodedNoQuotes = html_entity_decode($encoded, ENT_NOQUOTES, 'UTF-8');
// $decodedNoQuotes = '--> "E.V-Get.com" <--' (單引號實體保留)

// 數字實體解碼 (十進制/十六進制)
$numeric = 'A B'; // A B
echo html_entity_decode($numeric, ENT_QUOTES, 'UTF-8'); // "A B"
?>

配套函數對比表

函數作用轉換範圍典型用途
htmlentities()字符 → 實體所有非 ASCII + 特殊字符輸出到 HTML 頁面防 XSS
html_entity_decode()實體 → 字符所有 HTML 實體 (命名/數字)讀取已實體化的內容、數據清洗
htmlspecialchars()字符 → 實體僅 & < > " '表單輸出、屬性值、最常用防 XSS
htmlspecialchars_decode()實體 → 字符僅 & < > " '反轉 htmlspecialchars()
htmlspecialchars_decode()實體 → 字符同上同上

常見陷阱與避坑

問題原因解決
解碼後出現 亂碼編碼參數錯誤/不匹配顯式指定 'UTF-8',確保源數據確實是 UTF-8
雙重編碼 (如 &lt;)重複調用 htmlentities()使用 htmlspecialchars($str, ENT_QUOTES, 'UTF-8', false) 第4參數 false 禁止雙重編碼
命名實體不解碼 (如 ©)編碼標準不匹配使用 ENT_HTML5 旗標,支持更多 HTML5 命名實體
性能問題大字符串頻繁調用緩存結果、或用 strtr 針對少量固定實體替換

安全應用:防 XSS 輸出流程

<?php
// 1. 存儲前:不處理,存原始用戶輸入 (或標準化編碼)
// 2. 輸出到 HTML 內容區:
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');

// 3. 輸出到 HTML 屬性值:
echo '';

// 4. 輸出到 JavaScript 變量:
echo '';

// 5. 輸出到 URL 參數:
echo '搜索';

// 6. 若數據庫存的是已實體化字符串 (歷史數據),輸出前解碼再編碼:
$safe = htmlspecialchars(html_entity_decode($storedHtml, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, 'UTF-8');

總結

html_entity_decode() 是「實體 → 字符」的標準解碼器,**關鍵在於顯式指定 `ENT_QUOTES | ENT_HTML5` 和 `'UTF-8'`**。配套 htmlspecialchars() (編碼) 形成「存原始、輸出編碼」的防 XSS 最佳實踐。避免雙重編碼、編碼不匹配、命名實體不支持等常見坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved