Как усечь HTML на определенное количество символов?

У меня есть некоторый контент (некоторые из внешнего источника, некоторые специально написанные), которые отображаются в виде формата блога. Я хочу отрезать текст после определенного количества символов, поэтому в настоящее время я делаю это:

<?=substr( strip_tags($a['content']), 0, 400 )?> 

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

Что было бы хорошим способом усечения после X числа символов, но также сохранить некоторое базовое форматирование?

Solutions Collecting From Web of "Как усечь HTML на определенное количество символов?"

Не убежден, что это лучший подход к вашей проблеме, но он простой и будет работать, если вы беспокоитесь только о сохранении 1 или 2 тегов, чтобы сохранить некоторое базовое форматирование в html.

Таким образом, вы можете сделать что-то вроде: найти теги, которые хотите сохранить, и заменить их на уникальную комбинацию символов, затем после обрезания строки найдите / замените уникальную комбинацию строк, созданную с тегом, который вы изначально заменили.

 $content = str_replace("<br/>", "\n", $a['content']); $content = substr(strip_tags($content), 0, 400); echo str_replace("\n", "<br/>", $content); 

http://snippets.dzone.com/posts/show/7125

Это автоматически закроет любые теги, которые были обрезаны. Версии в комментариях кажутся лучше.

Это может не ответить на ваш вопрос, но это один из способов решения этой проблемы.

Если бы я писал блог, я бы хотел определить, где сообщение будет усечено. Таким образом, я мог бы опубликовать материал, как видео, и усекать сообщение, где заканчивается видео, а затем остальное можно отобразить, когда сообщение просматривается.

Попробуйте добавить определенную строку в том месте, где вы хотите, чтобы сообщение было усечено, например, «-» или какой-либо тэг, чтобы местоположение перерыва не было видимым.

Затем оттуда вы можете использовать mb_stripos для хранения местоположения строки прерывания, а затем передать это местоположение как длину для метода подстроки.

или…

 <?=substr( strip_tags($a['content']), 0, mb_stripo(strip_tags($a['content']), "break string"))?> 

Это может быть не так точно, как вы хотите, но если вы можете быть уверены, что только текстовые разметки, такие как ссылки заголовков и абзацы, где используется, что-то вроде:

 $i = 0; while($i < 400){ $i = strpos($string, '</p>', $i) + 4; } echo substr( $string, 0, strpos($string, '</p>', $i)+4); 

Это означает, что у вас будут переменные длины строк, но они будут как можно ближе к ближайшему абзацу.