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

PHP 移除 HTML 標籤原生函數深度解析:strip_tags 與 htmlspecialchars

     編輯:PHP 相關知識

PHP 移除 HTML 標籤原生函數深度解析:strip_tags 與 htmlspecialchars

處理使用者輸入內容時,移除或轉義 HTML 標籤是資安與顯示的基礎需求。PHP 提供兩大核心函數:strip_tags 移除標籤,htmlspecialchars 轉義特殊字元。本文詳細解析用法、陷阱與實戰組合技巧。

strip_tags — 移除 HTML 與 PHP 標籤

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

功能特性

  • 移除字串中所有 HTML、XML 與 PHP 標籤 (如 <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>
?>

htmlspecialchars — 特殊字元轉 HTML 實體

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

轉換對照表

字元轉換後
& (和號)&amp;
" (雙引號)&quot; (需 ENT_QUOTES)
< (小於)&lt;
> (大於)&gt;
' (單引號)&#039; (需 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);
// 輸出: &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
?>

實戰陷阱:資料庫儲存與讀取的雙重處理

常見場景:使用者輸入 → htmlspecialchars 存入 DB → 讀出顯示需移除標籤並截斷。

錯誤做法

<?php
// 讀取資料庫欄位 n_info (已被 htmlspecialchars 轉義)
$content = $row['n_info']; // 內容如: &lt;p&gt;Hello&lt;/p&gt;
// 直接 strip_tags 無效,因為標籤已變成實體字元
echo strip_tags($content); // 輸出仍含 &lt;p&gt;... 非預期
?>

正確流程:先解碼再移除標籤

<?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');
?>

最佳實踐建議

  1. 輸入端:不做過度過濾,僅做長度/格式驗證,原始資料入庫 (使用參數化查詢防 SQL 注入)。
  2. 輸出端:根據輸出上下文決定處理:
    • HTML 內容區:htmlspecialchars($str, ENT_QUOTES, 'UTF-8')
    • HTML 屬性值:同上,確保雙單引號皆轉義。
    • JavaScript 變數:json_encode($str) 輸出 JS 字串字面值。
    • 純文字顯示 (需移除標籤):strip_tags(htmlspecialchars_decode($str))
  3. 編碼一致性:全站統一 UTF-8,資料庫、連線、HTML meta、PHP default_charset 皆設為 UTF-8。
  4. 使用成熟庫:複雜場景建議用 HTMLPurifier 做白名單過濾,防 XSS 更徹底。

函數對照快查表

函數用途是否移除標籤是否轉義實體典型場景
strip_tags移除標籤是否純文字摘要、搜尋索引
htmlspecialchars轉義特殊字元否是HTML 輸出防 XSS
htmlentities轉義所有實體否是 (全部)XML/舊系統相容
htmlspecialchars_decode反轉義否否 (還原)讀取已轉義資料前處理
strip_tags + htmlspecialchars_decode組合:解碼後移除標籤是否 (先還原)資料庫已轉義內容的純文字提取

理解兩者差異與配合時機,是 PHP 開發者處理富文本內容的基本功。

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