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

PHP 去除 HTML 標籤:strip_tags 與 htmlspecialchars 差異詳解與選擇指南

     編輯:PHP 相關知識

兩個函數常被混淆:strip_tags() **移除**標籤,htmlspecialchars() **轉義**特殊字元讓標籤以純文字顯示。本文詳細對比用法、回傳值、適用場景與安全建議。

一、strip_tags():移除 HTML/PHP 標籤

語法

string strip_tags ( string $str [, string $allowable_tags ] )

特性

  • 刪除所有 <...> 標籤(含屬性),保留標籤內文字內容。
  • 第二參數可指定允許保留的標籤,如 '<b><i>'。
  • 標籤語法錯誤(如缺 >)可能導致誤刪或殘留。
  • 等同於 fgetss() 的字串版本。

範例

<?php
$html = '<div class="box"><b>粗體</b> <script>alert(1)</script></div>';
echo strip_tags($html);           // 粗體 alert(1)
echo strip_tags($html, '<b>');   // <b>粗體</b> alert(1)
?>

二、htmlspecialchars():轉義特殊字元為 HTML 實體

語法

string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = true ]]] )

轉換對照表

字元實體
& (and)&amp;
" (雙引號)&quot; (需 ENT_QUOTES)
< (小於)&lt;
> (大於)&gt;
' (單引號)&#039; (需 ENT_QUOTES)

常用旗標

  • ENT_QUOTES:同時轉義單雙引號(推薦永久開啟)。
  • ENT_HTML5:HTML5 模式(PHP 5.4+)。
  • ENT_DISALLOWED:替換文檔類型不允許的碼位。

範例

<?php
$html = '<a href="test">Link</a>';
echo htmlspecialchars($html, ENT_QUOTES, 'UTF-8');
// 輸出:&lt;a href=&quot;test&quot;&gt;Link&lt;/a&gt;
// 瀏覽器顯示為原始標籤文字,不會被解析為連結
?>

三、核心差異對比

維度strip_tagshtmlspecialchars
目的移除標籤,保留純文字轉義字元,讓標籤以原文顯示
結果無標籤純文字含實體編碼的原始標籤文字
安全性(XSS 防護)中:若 allowable_tags 開放 <script> 等危險標籤仍有風險高:所有標籤結構被中和,無法執行
資料完整性標籤結構遺失完整保留原始輸入結構
適用場景顯示用戶輸入的純文字摘要、搜尋關鍵字高亮移除標籤輸出到 HTML 內容區塊、表單值回填、API 回傳 HTML 片段

四、實戰選擇指南

  1. 用戶評論/留言顯示在頁面 → htmlspecialchars($input, ENT_QUOTES, 'UTF-8')(防 XSS 首選)。
  2. 搜尋結果摘要、Meta Description** → strip_tags($content) 取純文字再截斷。
  3. 後台管理編輯器內容預覽** → 視策略:嚴格模式用 htmlspecialchars,信任模式用 strip_tags($content, '<p><br><b><i><u><img>')。
  4. 表單重新填入值(value 屬性)** → htmlspecialchars($val, ENT_QUOTES) 防止屬性跳脫。
  5. 資料庫儲存前** → **不建議** 任何轉義,儲存原始輸入,**輸出時** 才根據上下文編碼(Context-Aware Output Encoding)。

五、進階:結合 nl2br 處理換行

<?php
// 文字區域輸入 → 資料庫 → 前端顯示(保留換行、防 XSS)
$output = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
$output = nl2br($output); // \n → <br />
echo $output;

// 或單行函數
function h($str) { return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); }
function hnl($str) { return nl2br(h($str)); }
?>

六、常見誤區

  • 誤以為 strip_tags 能防 XSS:若允許 <img onerror=alert(1)> 等事件屬性標籤,仍可執行腳本。
  • 雙重編碼:htmlspecialchars(htmlspecialchars($str)) 會將 &amp; 變 &amp;amp;。PHP 5.2.3+ 預設 double_encode=true,若已編碼請傳 false。
  • 編碼不一致:資料庫 UTF-8、PHP 預設 ISO-8859-1 會導致中文亂碼。永遠明確傳入 'UTF-8'。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved