strip_tags() 是 PHP 內建的字串處理函數,用於移除字串中的 HTML、XML 與 PHP 標籤。其語法如下:
string strip_tags ( string $str [, string $allowable_tags ] )參數說明:
回傳值:處理後的字串。
假設有一個包含多層標籤的字串:
$str = "<p>我來自<b><a href='https://www.example.com'>範例網站</a></b></p>";
echo strip_tags($str); // 輸出:我來自範例網站
echo strip_tags($str, "<a>"); // 輸出:我來自<a href='https://www.example.com'>範例網站</a>
多個標籤以空白字元分隔:
echo strip_tags($str, "<p> <b>"); // 輸出:<p>我來自<b>範例網站</b></p>
注意:<a> 標籤的屬性(如 href)會被完整保留,但 <p>、<b> 等無屬性標籤僅保留標籤本身。
strip_tags() 只能「白名單」模式(指定保留),若需「黑名單」模式(指定移除),需自行實作。以下為可移除指定標籤的自訂函數:
function strip_selected_tags($text, $tags = array()) {
$args = func_get_args();
$text = array_shift($args);
$tags = (func_num_args() > 2) ? array_diff($args, array($text)) : (array) $tags;
foreach ($tags as $tag) {
// 移除成對標籤並保留內容
if (preg_match_all('/<' . $tag . '[^>]*>([^<]*)</' . $tag . '>/iu', $text, $found)) {
$text = str_replace($found[0], $found[1], $text);
}
}
// 移除殘留的單獨標籤(如未閉合或帶屬性)
return preg_replace('/(<(' . join('|', $tags) . ')( | |.)*>)/iu', '', $text);
}
// 使用範例
$str = "<b>粗體文字</b> <i>斜體</i>";
echo strip_selected_tags($str, array('b'));
// 輸出:粗體文字 <i>斜體</i>
strip_tags() 不保證能防禦 XSS 攻擊。惡意使用者可能透過屬性注入腳本(如 <img src=x onerror=alert(1)>)。請搭配 htmlspecialchars() 或 HTML Purifier 等庫使用。<A> 與 <a> 視為相同。<dialog>、<slot> 等新標準標籤。strip_tags() 適合簡單的標籤過濾場景(如儲存純文本摘要)。需保留多標籤時,以空白分隔標籤名稱即可。若需精確移除特定標籤或防禦 XSS,建議使用 DOMDocument 解析或成熟的安全庫。