在 PHP 開發中,經常需要將包含 HTML 標籤、JavaScript 代碼、特殊實體字符的網頁內容轉換為純文本,例如用於搜索摘要、內容預覽或數據清洗。本文介紹一種基於正則表達式的完整解決方案,能一次性處理標籤移除、腳本剔除、空白壓縮及實體解碼。
<?php
// $document 應包含一個 HTML 文檔字符串
// 本例將去除 HTML 標記、JavaScript 代碼和多餘空白字符
// 並將常見 HTML 實體轉換為對應的文本字符
$search = array(
// 1. 移除 <script> 標籤及其內容(不區分大小寫、跨行匹配)
"'<script[^>]*?>.*?</script>'si",
// 2. 移除所有 HTML 標籤(包括註釋、閉合標籤等)
"'<[/!]*?[^<>]*?>'si",
// 3. 將換行符後的多個空白字符壓縮為單個空格
"'([\r\n])[\s]+'",
// 4-12. 替換常見 HTML 實體為對應字符
"'&(quot|#34);'i", // " → "
"'&(amp|#38);'i", // & → &
"'&(lt|#60);'i", // < → <
"'&(gt|#62);'i", // > → >
"'&(nbsp|#160);'i", // → 空格
"'&(iexcl|#161);'i", // ¡ → ¡
"'&(cent|#162);'i", // ¢ → ¢
"'&(pound|#163);'i", // £ → £
"'&(copy|#169);'i", // © → ©
"'&#(\d+);'e" // 數字實體 → 對應字符(需 PHP 7.0+ 使用替代方案)
);
$replace = array(
"", // 移除 script
"", // 移除標籤
"\1", // 保留換行符,壓縮空白
"\"", // 雙引號
"&", // & 符號
"<", // 小於號
">", // 大於號
" ", // 空格
chr(161), // ¡
chr(162), // ¢
chr(163), // £
chr(169), // ©
"chr(\1)" // 數字實體轉換(注意:/e 修飾符已棄用)
);
$text = preg_replace($search, $replace, $document);
?>
. 匹配換行符,實現跨行匹配preg_replace_callback<?php
function htmlToText($html) {
// 移除 script 和 style 標籤及內容
$html = preg_replace('/<(script|style)[^>]*>.*?<\/\1>/is', '', $html);
// 移除 HTML 註釋
$html = preg_replace('/<!--.*?-->/s', '', $html);
// 移除所有標籤
$html = preg_replace('/<[^>]++>/', '', $html);
// 解碼 HTML 實體
$html = html_entity_decode($html, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// 壓縮空白字符
$html = preg_replace('/\s+/u', ' ', $html);
return trim($html);
}
?>
DOMDocument 解析器htmlspecialchars 防止 XSS雖然正則表達式方案代碼簡潔,但現代 PHP 開發推薦使用 DOMDocument + html_entity_decode 組合,更健壯且符合最新標準。根據項目 PHP 版本選擇合適方案,並務必做好輸入驗證與輸出轉義。