「使用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();
因此,忽略html標籤,你想要的第一個n個字符的內容? 1個元素?整個文件的? – Zac 2012-02-20 17:37:49
我想要整個文檔的前n個字符的內容,但不要刪除標籤(但不要將標籤作爲n個字符的一部分計數)。 – melkamo 2012-02-20 18:10:36