Как обрезать HTML до определенного количества символов? - PullRequest
4 голосов
/ 04 июня 2010

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 04 июня 2010

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

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

0 голосов
/ 04 июня 2010

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

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

$content = str_replace("<br/>", "\n", $a['content']);
$content = substr(strip_tags($content), 0, 400); 
echo str_replace("\n", "<br/>", $content);
0 голосов
/ 04 июня 2010

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

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

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

0 голосов
/ 04 июня 2010

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

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

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

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

или ...

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