Ошибки HTML при усечении?

У меня есть следующая функция:

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

Если у меня есть следующий код:

 $html = '<div style="bla: bla;">somet30ext</div> <div id="bla">MORE AND MORE TEXT</div>'; print truncate($html, 30); 

Это будет отрезано при somet ….. Другими словами, мы заканчиваем с:

 <div style="bla: bla;">somet 

Т.е. незакрытый тег div. Как мне решить это?

Обновить:

Я не хочу урезать, только когда я доберусь до. Я хочу что-то, что может автоматически добавить div. В этом случае выход должен быть:

  <div style="bla: bla;">somet</div> 

Т.е. он фактически добавил, потому что знал, что он был закрыт? Правильно ли я предполагаю, что для этого я должен использовать что-то вроде очистителя html?

Не усекайте $html а скорее реальный текст, где это уместно. Чтобы получить текст, вы можете использовать PHP-функции xml ( DOM , SimpleXml ) или регулярное выражение. Хотя я бы советовал первым.

Пример использования Dom:

 $html = '<div style="bla: bla;">somet30ext</div> <div id="bla">MORE AND MORE TEXT</div>'; $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; 

Ну, в функции truncate просто найдите открывающие теги, подсчитайте их и посмотрите, чтобы эти теги закрылись, когда все закрыты, это ваша строка.