Intereting Posts
Как получить innerHtml, включая тег, используя jQuery? используя mailto для отправки электронной почты с приложением Google Translate не скрыт высота div: 100%; не работает с дисплеем: table-cell; Как предотвратить множественные вставки при отправке формы в PHP? Как получить все элементы внутри «div», которые начинаются с известного текста Как установить расстановку ячеек в таблицах только горизонтально Проблемы с сенсорным прокруткой на iOS при фокусировке входов Вручную изменение размера элемента не запускает наблюдателя мутации в Chrome Как отправить html-форму без перенаправления? Как извлечь содержимое статьи Text с HTML-страницы, например Pocket (Read It Later) или Readability? Почему переполненное меню работает плохо, когда в видимой оригинальной ul есть 0 элементов? jQuery – Анимированная складная DIV, скользящая вверх? Угловое-ngRoute: принудительное отображение содержимого ng-view, разрешить навигацию впоследствии Как проверить, существует ли $ _GET?

Как обрезать fragmentы HTML без разбивки тегов?

Скажем, у меня есть строка с 200 символами, содержащая разметку HTML. Я хочу показать предварительный просмотр только первых 50 символов. без «расщепления» тегов. Другими словами, fragment не должен содержать без . Любая обработка на стороне сервера должна быть в PHP.

Вы должны проверить Tidy HTML. Просто отрежьте его после первых 50 символов, отличных от HTML, а затем запустите его через Tidy, чтобы исправить HTML.

Простым подходом может быть strip_tags() а затем захват выдержки.

Короткий ответ: преобразуйте его в DOM с помощью DOMDocument::loadHTML($string) затем пройдите дерево, считая символы в текстовых узлах. Когда вы нажмете свой лимит, замените остальную часть этого узла на «…» или пустую строку и просто вызовите $node->parentNode->removeChild($node) на всех последующих узлах.

Вот быстрое и надежное решение, использующее DOMDocument, который является частью стандартного PHP:

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