函數簽名與參數
html_entity_decode(
string $string,
int $flags = ENT_COMPAT | ENT_HTML401,
?string $encoding = null
): string
引號處理標誌($flags)
| 常量 | 行為 |
ENT_COMPAT | 默認。僅解碼雙引號 ",忽略單引號 |
ENT_QUOTES | 解碼雙引號與單引號 " ' ' |
ENT_NOQUOTES | 不解碼任何引號 |
字符編碼支援
常用編碼:UTF-8(推薦)、ISO-8859-1、GB2312、BIG5、Shift_JIS 等。PHP 5.6+ 默認使用 default_charset 配置。
核心差異:html_entity_decode vs htmlspecialchars_decode
| 函數 | 解碼範圍 | 典型用途 |
html_entity_decode | 所有 HTML 實體(數字實體 Ӓ、十六進制 😀、命名實體 ©) | 還原富文本編輯器內容、解析第三方 HTML 數據 |
htmlspecialchars_decode | 僅 & < > " ' 五種基本實體 | 還原 htmlspecialchars 輸出,性能更高 |
htmlentities | 編碼端:將所有可轉換字符轉為實體 | 輸出用戶輸入防 XSS |
實戰示例
<?php
$html = '<div class="test">E.V-Get.com</div>';
// 1. 默認(不解碼單引號)
echo html_entity_decode($html);
// 輸出: <div class="test">E.V-Get.com</div>
// 2. 解碼所有引號
echo html_entity_decode($html, ENT_QUOTES);
// 輸出: E.V-Get.com
// 3. 指定編碼(處理中文實體)
$zh = '中文'; // "中文"
echo html_entity_decode($zh, ENT_QUOTES, 'UTF-8'); // 中文
常見坑點與避坑指南
- 雙重編碼問題:若字符串已經是純文本,再次調用會將
& 變為 &。解決:先檢測是否包含實體,或使用 htmlspecialchars_decode。
- 編碼不匹配導致亂碼:傳入
GB2312 內容卻用 UTF-8 解碼。解決:明確指定第三參數,或統一項目編碼為 UTF-8。
- 無效實體被忽略:無法識別的實體會保持原樣(PHP 5.4+),舊版本可能返回空字符串。
- 性能考量:大量數據處理時,
htmlspecialchars_decode 比 html_entity_decode 快 3-5 倍,僅需還原基本標籤時優先使用。
最佳實踐
- 輸出用戶內容到 HTML:
htmlspecialchars($input, ENT_QUOTES, 'UTF-8')
- 從數據庫讀取富文本輸出:
html_entity_decode($row['content'], ENT_QUOTES, 'UTF-8')
- API 返回 JSON 時:不要 實體編碼,直接輸出 UTF-8 字符,由前端框架處理轉義。