У меня есть следующая функция:
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 просто найдите открывающие теги, подсчитайте их и посмотрите, чтобы эти теги закрылись, когда все закрыты, это ваша строка.