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 跳過已存在的實體。 |
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 模式。<?php $str = "Bill & 'Steve'"; echo htmlentities($str, ENT_COMPAT); // 僅雙引號: Bill & 'Steve' echo "<br>"; echo htmlentities($str, ENT_QUOTES); // 雙引號+單引號: Bill & 'Steve' echo "<br>"; echo htmlentities($str, ENT_NOQUOTES); // 不轉換引號: Bill & 'Steve' ?>
<?php $str = "My name is Øyvind Åsane. I'm Norwegian."; echo htmlentities($str, ENT_QUOTES, "ISO-8859-1"); // 輸出: My name is Øyvind Åsane. I'm Norwegian. ?>
function h($string) {
return htmlentities($string, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
}
// 使用
echo '<div class="user-input">' . h($_POST['comment']) . '</div>';
ENT_SUBSTITUTE, ENT_DISALLOWED, ENT_HTML401, ENT_HTML5, ENT_XML1, ENT_XHTML。ENT_IGNORE。double_encode 參數。character-set 參數。htmlspecialchars(): 後者僅轉換 & " ' < > 五個字符,性能更高,大多數場景足夠。<meta charset="UTF-8">、PHP 文件編碼、數據庫連接編碼三者一致。