在處理使用者輸入、防止 XSS 攻擊或輸出純文字時,移除 HTML 標籤是常見需求。本文整理三種主流做法,從內建函式到自訂正則與手動解析,並說明適用情境與注意事項。
strip_tags() 函式最簡單、效能最好的方式,支援保留特定允許標籤:
<?php
$str = "hello <b>world!</b>";
echo strip_tags($str); // 輸出:hello world!
echo strip_tags($str, '<b>'); // 輸出:hello <b>world!</b>(保留 <b>)
語法:string strip_tags(string $str, string $allowable_tags = '')
優點:原生支援、速度快、處理不完整標籤有容錯機制。
缺點:無法處理屬性內的惡意腳本(如 <img src=x onerror=alert(1)>),若需深度防護請搭配 HTML Purifier。
保留段落與換行,移除其他標籤:
<?php
$reg = '/(<\/?p>|<br\s*\/?>)|<.+?>/i';
echo preg_replace($reg, '$1', $str);
適用於需保留特定排版標籤的情境,但正則處理巢狀或不完整 HTML 易出錯,維護成本較高。
手動掃描 < 與 > 並移除中間內容:
<?php
function delhtml($str) {
$st = $et = -1;
$stmp = [' '];
$len = strlen($str);
for ($i = 0; $i < $len; $i++) {
$ss = substr($str, $i, 1);
if (ord($ss) == 60) $st = $i; // 遇到 <
if (ord($ss) == 62) { // 遇到 >
$et = $i;
if ($st != -1) {
$stmp[] = substr($str, $st, $et - $st + 1);
}
}
}
return str_replace($stmp, '', $str);
}
教學價值高,但效能較差且未處理 HTML 實體編碼,生產環境不建議使用。
<?php
function clear_html_label($html) {
$search = [
"'<script[^>]*?>.*?</script>'si",
"'<[/!]*?[^<>]*?>'si",
"'([\r\n])[\s]+'",
"'&(quot|#34);'i",
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
// ... 更多實體對應
];
$replace = ['', '', '\1', '"', '&', '<', '>', ' ', chr(161), chr(162), chr(163), chr(169), 'chr(1)'];
return preg_replace($search, $replace, $html);
}
此法同時處理標籤移除與實體解碼,適合需還原純文字內容的場景。
htmlspecialchars() 轉義,而非儲存端移除標籤。strip_tags(),複雜規則才考慮正則或第三方庫。