Truncar texto sem truncar HTML

Essa string possui 78 caracteres com HTML e 39 caracteres sem HTML:

I really like the Google search engine.

Eu quero truncar essa string com base na contagem de caracteres não-HTML, então, por exemplo, se eu quisesse truncar a seqüência acima para 24 caracteres, a saída seria:

 I really like the Google 

O truncamento não levou em consideração o html ao determinar o número de caracteres para cortar, ele só considerou a contagem despojada. No entanto, não deixou tags HTML abertas.

Tudo bem, então é o que eu coloco e parece estar funcionando:

 function truncate_html($string, $length, $postfix = '…', $isHtml = true) { $string = trim($string); $postfix = (strlen(strip_tags($string)) > $length) ? $postfix : ''; $i = 0; $tags = []; // change to array() if php version < 5.4 if($isHtml) { preg_match_all('/<[^>]+>([^<]*)/', $string, $tagMatches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); foreach($tagMatches as $tagMatch) { if ($tagMatch[0][1] - $i >= $length) { break; } $tag = substr(strtok($tagMatch[0][0], " \t\n\r\0\x0B>"), 1); if ($tag[0] != '/') { $tags[] = $tag; } elseif (end($tags) == substr($tag, 1)) { array_pop($tags); } $i += $tagMatch[1][1] - $tagMatch[0][1]; } } return substr($string, 0, $length = min(strlen($string), $length + $i)) . (count($tags = array_reverse($tags)) ? '' : '') . $postfix; } 

Uso:

 truncate_html('

I really like the Google search engine.

', 24);

A function foi tirada de (fez uma pequena modificação):

http://www.dzone.com/snippets/truncate-text-preserving-html