在內容摘要生成、郵件純文本版本、搜索引擎索引、API 返回純文本等場景,常需要將富文本 HTML 轉換為保留基本段落結構的純文本。單純使用 strip_tags() 會導致段落粘連、特殊實體未解碼、空白字符異常等問題。
/is', '', $str);
$str = preg_replace('//is', '', $str);
// 2. 將塊級標籤轉換為換行標記
$blockTags = ['br', 'p', 'div', 'blockquote', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'tr'];
foreach ($blockTags as $tag) {
$str = preg_replace('/<\/?' . $tag . '\b[^>]*>/i', '>>>>', $str);
}
// td/th 保留列分隔
$str = preg_replace('/<\/?(td|th)\b[^>]*>/i', '', $str);
// 3. 處理 HTML 實體
$entityMap = [
' ' => ' ', '&' => '&', '<' => '<', '>' => '>',
'“' => '"', '”' => '"', '‘' => "'", '’' => "'",
'"' => '"', ''' => "'", ''' => "'",
];
$str = strtr($str, $entityMap);
// 4. 去除剩餘標籤
$str = strip_tags($str);
// 5. 解碼數字實體(如 〹)
$str = html_entity_decode($str, ENT_QUOTES, 'UTF-8');
// 6. 清理多餘換行標記與空白
$str = preg_replace('/(>>>>\s*)+/', "\n\n", $str); // 合併連續換行
$str = preg_replace('/[ \t]+/', ' ', $str); // 合併空白
$str = trim($str);
return $str;
}
?>
$html = <<
標題
第一段內容,包含 空格 與粗體。
第二段
換行測試
<p>、<div>、<br> 等替換為統一換行標記 >>>>,最終合併為雙換行,保持閱讀節奏。 等干擾閱讀。ENT_QUOTES 並明確 UTF-8,防止多字節字符截斷。strip_tags 前提取 <a href="..."> 並轉換為 [文字](URL) 格式。<strong> 轉 **、<em> 轉 * 等。DOMDocument 解析而非正則,健壯性更高。本函數在 strip_tags 基礎上增強了結構保留與實體處理,適合多數「HTML 轉純文本」的工程場景。實際使用時可根據業務對標籤映射規則進行微調。