2012-02-20 46 views
0

給定一個HTML字符串的第一個字符「n」,我想具有以下屬性返回修改後的字符串:使用PHP的DOM實現返回一個HTML字符串

  1. 第一ň的字符文本內容(除了HTML標籤)應該保留。
  2. 之後的元素n字符已被符合應完全刪除。
  3. 如果n字符不在一個元素的末尾,則相同元素中的文本不應保留。
  4. 之前的元素標籤應保留字符。

基本上,我只是想返回HTML的縮短版本,沒有DOM結構被打斷,並且僅基於文本內容的長度。

使用PHP的DOM實現,看起來這會過於複雜。使用模式匹配並不理想,因爲修改過的字符串的條件可能隨時間而改變,並且每次都需要重寫。

我錯過了一個更簡單的方法嗎?提前致謝。

+0

因此,忽略html標籤,你想要的第一個n個字符的內容? 1個元素?整個文件的? – Zac 2012-02-20 17:37:49

+0

我想要整個文檔的前n個字符的內容,但不要刪除標籤(但不要將標籤作爲n個字符的一部分計數)。 – melkamo 2012-02-20 18:10:36

回答

1

「使用PHP的DOM實現,看起來這會過於複雜。」

真的嗎?

如果您想要<body>標記及其子節點內的前100個字符,則這是一個非常簡單的DOM實現。您可以進一步按摩該按鈕以刪除換行符和多餘的空格/製表符或檢查foreach中的$content字符串的長度以打破循環並在達到特定數量的字符後停止連接。

$str = '...'; 
$dom = new DomDocument; 
$dom->loadHTML($str); 
$elements = $dom->getElementsByTagName('body'); 

$content = ''; 
foreach($elements as $node){ 
    foreach($node->childNodes as $child) { 
    $content .= $child->nodeValue; 
    } 
} 

echo substr($content, 0, 100); 

UPDATE

根據您的評論,這裏有一個簡單的方法來計算節點HTML裏面的人物,並達到指定的字符限制後刪除所有的標籤。請注意,您不能在原始foreach內執行刪除操作,因爲它會導致DOM重新爲節點重新編排索引,並且不會得到期望的結果。相反,我們將要刪除的節點存儲在數組中,並在初始迭代後刪除它們。

$str = '...'; 
$dom = new DomDocument; 
$dom->preserveWhitespace = FALSE; 
$dom->loadHTML($str); 

$elements = $dom->getElementsByTagName('body'); 

$remove = FALSE; 
$maxChars = 100; 
$content = ''; 
$delete = array(); 

foreach($elements as $node){ 
    foreach($node->childNodes as $child) { 
    if ($remove) { 
     $delete[] = $child; 
    } else { 
     $content .= $child->nodeValue; 
     if (! $remove && strlen($content) >= $maxChars) { 
     $remove = TRUE; 
     } 
    } 
    } 
} 

foreach ($delete as $child) { 
    $child->parentNode->removeChild($child); 
} 

$dom->formatOutput = TRUE; 
echo $dom->saveHTML(); 
+0

謝謝,但這只是文本內容,刪除了所有標籤。 – melkamo 2012-02-20 18:12:08

+0

@melkamo我以爲這就是你要找的。如果你能夠澄清你想要的內容,我很樂意更新。 *「文本內容的前n個字符(保留HTML標籤)應保留。「* – rdlowrey 2012-02-20 18:13:17

+0

對不起,我不明白,我試圖說明修改後的字符串和原始字符串之間的區別,並不是說刪除標籤,換句話說,截斷文本的節點應該僅基於文本的長度但是標籤應該保留 – melkamo 2012-02-20 18:16:18

相關問題