這裏有一個簡單的方法,你可以用DOM文檔做到這一點,它不是完美的,但它可能會感興趣:
<?php
function html_tidy($src){
libxml_use_internal_errors(true);
$x = new DOMDocument;
$x->loadHTML('<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />'.$src);
$x->formatOutput = true;
$ret = preg_replace('~<(?:!DOCTYPE|/?(?:html|body|head))[^>]*>\s*~i', '', $x->saveHTML());
return trim(str_replace('<meta http-equiv="Content-Type" content="text/html;charset=utf-8">','',$ret));
}
$brokenHTML[] = "<p><span>This is some broken html</spa";
$brokenHTML[] = "<poken html</spa";
$brokenHTML[] = "<p><span>This is some broken html</spa</p>";
/*
<p><span>This is some broken html</span></p>
<poken html></poken>
<p><span>This is some broken html</span></p>
*/
foreach($brokenHTML as $test){
echo html_tidy($test);
}
?>
雖然注意到Mike 'Pomax' Kamermans
的評論。
這聽起來很傻,但最好的辦法是做輸入驗證和拒絕超過400個字符的輸入,所以這首先不會發生。如果客戶可以輸入您的代碼無法處理的內容,請防止發生這種情況。 –
你需要字符串中的任何HTML嗎?如果沒有,也許你可以strip_tags http://php.net/manual/en/function.strip-tags.php編輯:你可以結合使用這個找到/如果得到一個替代結果不會strip_tags除非[條件]。 – redditor
只是刪除損壞的結束標記不會有多大幫助:您仍然會打開標記。如果包含標籤的標籤可能也會丟失?考慮是試圖重建缺失的標籤,還是完全去除畸形的標籤。這不是一個簡單的問題,也不是 - 我沒有答案。 – 2013-06-19 01:53:42