Errores de HTML al truncar?

Tengo la siguiente función:

function truncate($string, $limit, $break=".", $pad="...") { if(strlen($string) <= $limit) return $string; if(false !== ($breakpoint = strpos($string, $break, $limit))) { if($breakpoint < strlen($string) - 1) { $string = substr($string, 0, $breakpoint) . $pad; } } return $string; } 

Si tengo el siguiente código:

 $html = '
somet30ext
MORE AND MORE TEXT
'; print truncate($html, 30);

Se cortará en algún momento ….. En otras palabras, terminamos con:

 
somet

Es decir, una etiqueta div no cerrada. ¿Cómo voy a resolver esto?

Actualizar:

No quiero truncar solo cuando llegue al. Quiero algo que pueda agregar divs automáticamente. En este caso, la salida debería ser:

  
somet

Es decir, ¿agregó el porque sabía que estaba cerrado? ¿Estoy en lo correcto al asumir que debo usar algo como html purifier para esto?

No trunque el $html sino el texto real donde sea apropiado. Para obtener el texto, puede usar las funciones xml de php ( DOM , SimpleXml ) o expresiones regulares. Aunque yo aconsejaría el primero.

Ejemplo usando Dom:

 $html = '
somet30ext
MORE AND MORE TEXT
'; $dom = new DomDocument; $dom->loadHtml($html); $xpath = new DomXpath($dom); // example of getting a div with id=bla $bla = $xpath->query('//div[@id="bla"]')->item(0); if ($bla instanceof DomNode) { // truncate here if (strlen($bla->nodeValue) > 10) { $bla->nodeValue = substr($bla->nodeValue, 0, 10) . '...'; } } // collect result, this is needed due to dom->loadhtml wrapping the loaded string // with html/body if not present $result = ''; foreach ($xpath->query('//body/*') as $childNode) { $result .= $dom->saveHtml($childNode); } echo $result;

Bueno, en la función truncado solo busque las tags de apertura, cuéntelas y busque que estas tags se cierren, cuando todas están cerradas, esa es su cadena.