“使用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