2013-06-19 33 views
1

我遇到了一個問題,其中顯示了多達400個字符的數據庫字符串,但是,該字符串必須包含HTML實體。刪除HTML實體(如果未完成)

一次偶然的機會,客戶創造了字符串有400個字符在關閉p標籤的中間偏右坐,從而殺死標籤,導致其他錯誤的之後的代碼。

我寧願今天的閉幕p標籤被完全刪除,因爲我有一個「...更多」附加到年底,如果連接到現有的段落這看起來更清潔的鏈接。

這將覆蓋所有HTML實體問題的最佳方法是什麼?是否有一個PHP函數會自動關閉/刪除任何錯誤的HTML標籤?我不需要編碼答案,只是一個方向將有很大幫助。

謝謝。

+2

這聽起來很傻,但最好的辦法是做輸入驗證和拒絕超過400個字符的輸入,所以這首先不會發生。如果客戶可以輸入您的代碼無法處理的內容,請防止發生這種情況。 –

+0

你需要字符串中的任何HTML嗎?如果沒有,也許你可以strip_tags http://php.net/manual/en/function.strip-tags.php編輯:你可以結合使用這個找到/如果得到一個替代結果不會strip_tags除非[條件]。 – redditor

+0

只是刪除損壞的結束標記不會有多大幫助:您仍然會打開標記。如果包含標籤的標籤可能也會丟失?考慮是試圖重建缺失的標籤,還是完全去除畸形的標籤。這不是一個簡單的問題,也不是 - 我沒有答案。 – 2013-06-19 01:53:42

回答

3

這裏有一個簡單的方法,你可以用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的評論。

+0

哇!這真的有用!這讓我整晚都不用拉我的頭髮。謝謝! :) – Imtiaz

+0

@Imtiaz np,很高興它有幫助 –

0

你爲什麼不把最後一個字的段落或內容,並刪除它,如果字是完整的,你刪除它,如果沒有完成,你也刪除它,你是確保內容還算乾淨,我告訴你的將是什麼代碼就像一個例子:

while($row = $req->fetch(PDO::FETCH_OBJ){ 
    //extract 400 first characters from the content you need to show 
    $extraction = substr($row->text, 0, 400); 
    // find the last space in this extraction 
    $last_space = strrpos($extraction, ' '); 
    //take content from the first character to the last space and add (...) 
    echo substr($extraction, 0, $last_space) . ' ...'; 
} 
0

只是刪除最後一個破標記,然後用strip_tags

$str = "<p>this is how we do</p"; 
$str = substr($str, 0, strrpos($str, "<")); 
$str = strip_tags($str);