如何在不破坏标签的情况下剪辑HTML片段?

时间:2010-01-20 21:35:46

标签: php html post tags

假设我有一个包含HTML标记的200个字符的字符串。我想展示前50个字符的预览。没有'拆分'标签。换句话说,片段不应包含<b>而不包含</b>。任何服务器端处理都应该是PHP。

4 个答案:

答案 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;
}