Come tagliare i frammenti HTML senza decomporre i tag?

Supponiamo che abbia una stringa di 200 caratteri che contiene markup HTML. Voglio mostrare un’anteprima dei primi 50 caratteri. senza ‘dividere’ i tag. In altre parole, il frammento non dovrebbe contenere un senza un . Qualsiasi elaborazione lato server dovrebbe essere in PHP.

Dovresti controllare Tidy HTML. Basta tagliarlo dopo i primi 50 caratteri non HTML, quindi eseguirlo attraverso Tidy per correggere l’HTML.

Un approccio semplice potrebbe essere prima strip_tags() e quindi catturare l’estratto.

Risposta breve: convertirlo in DOM con DOMDocument::loadHTML($string) quindi camminare l’albero contando i caratteri nei nodes di testo. Quando raggiungi il limite, sostituisci il resto di quel nodo con ‘…’ o la stringa vuota, e chiama semplicemente $node->parentNode->removeChild($node) su tutti i nodes successivi.

Ecco una soluzione rapida e affidabile che utilizza DOMDocument che fa parte del PHP standard:

 function cut_html ($html, $limit) { $dom = new DOMDocument(); $dom->loadHTML(mb_convert_encoding("
{$html}
", "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; }