導讀:在 PHP 生成靜態頁面或處理混合編輯的內容時,常因 HTML 標籤未閉合、巢狀錯誤導致版面崩潰。本文分享一個實用的 PHP 函數,能自動補全缺失的閉合標籤並過濾無效標籤,快速修復結構錯誤。
當網頁內容的 HTML 標籤顯示不全、表格標籤結構破損,或內容錯誤包含了外部頁面片段時,我們可以透過自訂函數來補全標籤並過濾雜訊。以下是核心實現代碼:
function closetags($html) {
// 匹配所有非自閉合標籤的開啟標籤 (排除 meta, img, br, hr, input)
preg_match_all('#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?>#iU', $html, $result);
$openedtags = $result[1];
// 匹配所有已存在的閉合標籤
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[1];
$len_opened = count($openedtags);
// 若開啟與閉合標籤數量一致,視為已平衡,直接返回
if (count($closedtags) == $len_opened) {
return $html;
}
// 反轉開啟標籤陣列,從內層向外層補全
$openedtags = array_reverse($openedtags);
for ($i = 0; $i < $len_opened; $i++) {
// 若該標籤未在閉合陣列中找到對應項,補全閉合標籤
if (!in_array($openedtags[$i], $closedtags)) {
$html .= '</' . $openedtags[$i] . '>';
} else {
// 已有對應閉合標籤,從閉合陣列移除,避免重複判斷
unset($closedtags[array_search($openedtags[$i], $closedtags)]);
}
}
return $html;
}
unset() 移除已匹配的閉合標籤,提升後續查找效率。meta、img、br、hr、input 等自閉合標籤,避免誤判。<b><i></b></i>)可能無法完美修復,建議搭配 DOMDocument 或 tidy 擴展使用。作者部落格:https://blog.sina.com.cn/s/articlelist_2129618781_0_1.html