2011-08-23 102 views
1

我有以下功能:截斷HTML錯誤?

function truncate($string, $limit, $break=".", $pad="...") { 
    if(strlen($string) <= $limit) return $string; 
    if(false !== ($breakpoint = strpos($string, $break, $limit))) { 
     if($breakpoint < strlen($string) - 1) { 
     $string = substr($string, 0, $breakpoint) . $pad; 
     } 
    } 

    return $string; 
} 

如果我有以下代碼:

$html = '<div style="bla: bla;">somet30ext</div> <div id="bla">MORE AND MORE TEXT</div>'; 
print truncate($html, 30); 

它將在舒美特切斷.....換句話說,我們最終用:

<div style="bla: bla;">somet 

iee一個未封閉的div標籤。我該如何解決這個問題?

更新:

我不想截斷,只有當我到達。我想要一些可以自動添加div的東西。在這種情況下,輸出應該是:

 <div style="bla: bla;">somet</div> 

即,它實際上增加了,因爲它知道它沒有關閉?我是否正確地假設我必須使用像html淨化器這樣的東西?

+0

指望標記和屬性和截斷算屬性值呢? – hakre

回答

5

不要截斷$html,而是截取真實文本適合的地方。要獲取文本,可以使用php的xml函數(DOM,SimpleXml)或正則表達式。雖然我會建議第一個。

示例使用DOM:

$html = '<div style="bla: bla;">somet30ext</div> <div id="bla">MORE AND MORE TEXT</div>'; 

$dom = new DomDocument; 
$dom->loadHtml($html); 

$xpath = new DomXpath($dom); 

// example of getting a div with id=bla 
$bla = $xpath->query('//div[@id="bla"]')->item(0); 
if ($bla instanceof DomNode) { 

    // truncate here 
    if (strlen($bla->nodeValue) > 10) { 
    $bla->nodeValue = substr($bla->nodeValue, 0, 10) . '...'; 
    } 
} 

// collect result, this is needed due to dom->loadhtml wrapping the loaded string 
// with html/body if not present 
$result = ''; 
foreach ($xpath->query('//body/*') as $childNode) { 
    $result .= $dom->saveHtml($childNode); 
} 

echo $result; 
+0

好吧,現在我需要一個可以去掉標籤,截斷它,然後重新添加相關html標籤的函數? – coderama

+0

不,您將使用給定的庫中的一個來查找html中的文本*並將其截斷。這樣html結構將保持不變。我會盡快提供一個例子。 – Yoshi

+0

+1用於推薦DOM功能。他們是最棒的! – jolt

0

那麼,在truncate函數中,只需查找開始標籤,對它們進行計數,然後查找這些標籤以關閉,當所有標籤都關閉時,這就是您的字符串。

+0

我想你誤會了。請檢查我的更新。 – coderama

+0

所以你想添加html標籤到最後? –

+0

或者:如果它們在截斷結束時仍處於打開狀態,請關閉它們。 – hakre