假设我有一个包含HTML标记的200个字符的字符串。我想展示前50个字符的预览。没有'拆分'标签。换句话说,片段不应包含<b>
而不包含</b>
。任何服务器端处理都应该是PHP。
答案 0 :(得分:3)
You should check out Tidy HTML.只需在前50个非HTML字符后剪切,然后通过Tidy将其运行到修复 HTML。
答案 1 :(得分:0)
一个简单的方法可能是先strip_tags()
,然后抓取摘录。
答案 2 :(得分:0)
简短回答:使用DOMDocument::loadHTML($string)
将其转换为DOM,然后遍历计算文本节点中字符的树。达到限制时,用“...”或空字符串替换该节点的其余部分,然后在所有后续节点上调用$node->parentNode->removeChild($node)
。
答案 3 :(得分:0)
这是使用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;
}