strip_tags() 旨在移除 HTML/PHP 標簽,但官方文檔明確警告:**無法驗證 HTML 完整性,殘破標簽將導致更多數據被誤刪**。
$str = '<div>string</div>string<string<b>hello</b><div>string</div>'; echo strip_tags($str, '<div>');
預期:保留 <div>,其餘標簽移除,文本保留
實際輸出:<div>string</div>string
原因:<string 中的孤立 < 被誤判為標簽開始,導致後續所有內容被吞噬。
function fixtags($text) {
$text = htmlspecialchars($text); // 先實體化所有特殊字符
$text = preg_replace("/"/", ""\"", $text); // 還原引號
// 匹配完整標簽結構並還原
$tags = "/<(!|)(\/|)(\w*)(\ |)(\w*)([\\\=]*)(?|(\")\""\"|)(?|(.*)?"(\")|)([\ ]?)(\/|)>/i";
$replacement = "<$1$2$3$4$5$6$7$8$9$10$11>";
$text = preg_replace($tags, $replacement, $text);
$text = preg_replace("/=\"\"/", "=", $text);
$text = preg_replace("/"\"/", "\"", $text);
return $text;
}
strip_tags(fixtags($string), '<div>');
| 步驟 | 作用 | 副作用 |
|---|---|---|
| htmlspecialchars | 將 < > " 實體化 | 所有標簽失效,純文本化 |
| 正則還原合法標簽 | 按標準結構匹配並還原 <tag attr="val"> | 極其複雜的正則,性能開銷大 |
| 清理殘留實體 | 還原屬性值引號、等號 | 可能誤傷合法文本中的實體 |