【发布时间】:2011-01-07 11:46:10
【问题描述】:
假设我有一个包含 HTML 标记的 200 个字符的字符串。我想显示前 50 个字符的预览。无需“拆分”标签。换句话说,片段不应该包含没有</b> 的<b>。任何服务器端处理都应该在 PHP 中。
【问题讨论】:
假设我有一个包含 HTML 标记的 200 个字符的字符串。我想显示前 50 个字符的预览。无需“拆分”标签。换句话说,片段不应该包含没有</b> 的<b>。任何服务器端处理都应该在 PHP 中。
【问题讨论】:
You should check out Tidy HTML. 只需在前 50 个非 HTML 字符之后将其剪切,然后通过 Tidy 运行以修复 HTML。
【讨论】:
这是一个使用 DOMDocument 的快速可靠的解决方案,它是标准 PHP 的一部分:
function cut_html ($html, $limit) {
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding("<div>{$html}</div>", "HTML-ENTITIES", "UTF-8"), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
cut_html_recursive($dom->documentElement, $limit);
return substr($dom->saveHTML($dom->documentElement), 5, -6);
}
function cut_html_recursive ($element, $limit) {
if($limit > 0) {
if($element->nodeType == 3) {
$limit -= strlen($element->nodeValue);
if($limit < 0) {
$element->nodeValue = substr($element->nodeValue, 0, strlen($element->nodeValue) + $limit);
}
}
else {
for($i = 0; $i < $element->childNodes->length; $i++) {
if($limit > 0) {
$limit = cut_html_recursive($element->childNodes->item($i), $limit);
}
else {
$element->removeChild($element->childNodes->item($i));
$i--;
}
}
}
}
return $limit;
}
【讨论】:
一个简单的方法可能是先到strip_tags(),然后捕获摘录。
【讨论】:
简答:使用DOMDocument::loadHTML($string) 将其转换为DOM,然后遍历树计算文本节点中的字符。当您达到限制时,将该节点的其余部分替换为“...”或空字符串,然后在所有后续节点上简单地调用 $node->parentNode->removeChild($node)。
【讨论】: