2010-06-04 3 views
4

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

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

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

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

+0

возможно http://stackoverflow.com/questions/1193500/php-truncate-html-ignoring-tags поможет? – Max

ответ

0

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

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

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

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

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

+2

Ха, этот комментарий бесценен: «Мне нравятся маленькие имена переменных, для меня скучно набирать длинные имена». – DisgruntledGoat

+0

Ссылка не работает. –

0

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

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

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

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

или ...

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

Я использую специальный компонент Joomla, который я написал, и ваш метод на самом деле использует Joomla в своих обычных статьях. Проблема заключается в том, что 90% контента поступает из внешнего источника (лента новостей). – DisgruntledGoat

0

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

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

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

Смежные вопросы