У меня есть некоторый контент (некоторые из внешнего источника, некоторые специально написанные), которые отображаются в виде формата блога. Я хочу отрезать текст после определенного количества символов, поэтому в настоящее время я делаю это:
<?=substr( strip_tags($a['content']), 0, 400 )?>
Проблема в том, что это теряет все форматирование, и я получаю только один массивный текст. Но если я не разделяю теги, очевидно, что некоторые теги будут закрыты и испортить макет.
Что было бы хорошим способом усечения после X числа символов, но также сохранить некоторое базовое форматирование?
Не убежден, что это лучший подход к вашей проблеме, но он простой и будет работать, если вы беспокоитесь только о сохранении 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);
Это означает, что у вас будут переменные длины строк, но они будут как можно ближе к ближайшему абзацу.