處理使用者輸入內容時,移除或轉義 HTML 標籤是資安與顯示的基礎需求。PHP 提供兩大核心函數:strip_tags 移除標籤,htmlspecialchars 轉義特殊字元。本文詳細解析用法、陷阱與實戰組合技巧。
string strip_tags ( string $str [, string $allowable_tags ] )
<div>, <?php ... ?>)。$allowable_tags 可指定允許保留的標籤 (如 '<p><br>')。>) 會導致誤判,可能移除非標籤內容。fgetss() (從檔案指標讀取並移除標籤)。<?php
$text = '<p>Hello <b>World</b>!</p><script>alert(1)</script>';
echo strip_tags($text); // 輸出: Hello World!
echo strip_tags($text, '<p>'); // 輸出: <p>Hello World!</p>
?>
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )
| 字元 | 轉換後 |
|---|---|
| & (和號) | & |
| " (雙引號) | " (需 ENT_QUOTES) |
| < (小於) | < |
| > (大於) | > |
| ' (單引號) | ' (需 ENT_QUOTES) |
ENT_COMPAT (預設):轉換雙引號,不轉單引號。ENT_QUOTES:雙單引號都轉換 (推薦用於屬性值)。ENT_NOQUOTES:都不轉換。ENT_HTML5:HTML5 模式 (PHP 5.4+)。<?php
$html = "<a href='test'>Test</a>";
echo htmlspecialchars($html, ENT_QUOTES);
// 輸出: <a href='test'>Test</a>
?>
常見場景:使用者輸入 → htmlspecialchars 存入 DB → 讀出顯示需移除標籤並截斷。
<?php
// 讀取資料庫欄位 n_info (已被 htmlspecialchars 轉義)
$content = $row['n_info']; // 內容如: <p>Hello</p>
// 直接 strip_tags 無效,因為標籤已變成實體字元
echo strip_tags($content); // 輸出仍含 <p>... 非預期
?>
<?php
// 1. 先將 HTML 實體還原為原始字元
$decoded = htmlspecialchars_decode($content, ENT_QUOTES);
// 2. 再移除標籤
$stripped = strip_tags($decoded);
// 3. 最後截取 60 字元顯示
echo mb_substr($stripped, 0, 60, 'UTF-8');
// 一行寫法
echo mb_substr(strip_tags(htmlspecialchars_decode($value['n_info'], ENT_QUOTES)), 0, 60, 'UTF-8');
?>
htmlspecialchars($str, ENT_QUOTES, 'UTF-8')json_encode($str) 輸出 JS 字串字面值。strip_tags(htmlspecialchars_decode($str))default_charset 皆設為 UTF-8。HTMLPurifier 做白名單過濾,防 XSS 更徹底。| 函數 | 用途 | 是否移除標籤 | 是否轉義實體 | 典型場景 |
|---|---|---|---|---|
| strip_tags | 移除標籤 | 是 | 否 | 純文字摘要、搜尋索引 |
| htmlspecialchars | 轉義特殊字元 | 否 | 是 | HTML 輸出防 XSS |
| htmlentities | 轉義所有實體 | 否 | 是 (全部) | XML/舊系統相容 |
| htmlspecialchars_decode | 反轉義 | 否 | 否 (還原) | 讀取已轉義資料前處理 |
| strip_tags + htmlspecialchars_decode | 組合:解碼後移除標籤 | 是 | 否 (先還原) | 資料庫已轉義內容的純文字提取 |
理解兩者差異與配合時機,是 PHP 開發者處理富文本內容的基本功。