$str = '<div>string</div>string<FONT ></FONT>string<b>hello</b><div>string</div>'; echo strip_tags($str, '<div>');
<div>string</div>string<FONT ></FONT>stringhello<div>string</div>
<div>string</div>string
PHP 官方文檔明確警告:
Warning: Because strip_tags() does not actually validate HTML, partial or broken tags can result in the removal of more data than expected.
關鍵點在於 <FONT ></FONT> 中的孤立「<」字符。strip_tags 掃描到這個「<」時,誤以為是標籤開始,但後續無法匹配完整標籤結構,導致解析器進入錯誤狀態,直接丟棄後續所有內容。
strip_tags 設計初衷是「快速、簡單、保守」的標籤剝離,非完整 HTML 解析器。引入完整解析器(如 DOMDocument)會大幅增加性能開銷與複雜度,違背其輕量定位。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| strip_tags | 內置、極快、無依賴 | 破損標籤導致數據丟失、無法處理屬性過濾 | 純文本輸入、可信來源、簡單過濾 |
| HTMLPurifier | 標準兼容、XSS 防護、可配置白名單 | 體積大、性能較慢、需 Composer 安裝 | 富文本編輯器輸出、用戶生成內容(UGC) |
| DOMDocument + XPath | 原生、結構化操作、可精確保留屬性 | 錯誤容錯差、需手動處理實體編碼 | 結構化 HTML 片段處理、模板渲染 |
| 正則表達式 | 靈活、無依賴 | 極易寫錯、HTML 不規則難覆蓋、性能不可控 | 極簡場景、臨時腳本 |
strip_tags 處理不可信的富文本輸入——它不是安全函數。strip_tags 但需預先清洗孤立「<」「>」:$str = str_replace(['<', '>'], ['<', '>'], $str); 再調用。{$var|escape:'html'}(Smarty)或 htmlspecialchars,而非 strip_tags。strip_tags 是一把「鈍刀」:快但不準,遇到破損標籤會誤傷無辜內容。理解其「保守截斷」行為,在正確場景(可信簡單輸入)使用,複雜場景轉向專業庫,才能兼顧安全與數據完整性。