На моей странице у меня есть предварительный просмотр сообщений из RSS-каналов. Каждый предварительный просмотр сообщения содержит около 300 символов. Когда пользователь нажимает кнопку расширения, #post-preview
заменяется #post
. #post показывает остальную часть сообщения.
Все в порядке с этим, но формат #post
не является хорошим, не читаемым. Поэтому я подумал о том, чтобы разрешать теги <br><b><p>
, это будет нормально читать. Поскольку я не хочу, чтобы пользователь был отвлечен, я хочу, чтобы теги были разрешены после 300 символов.
Используя следующий метод, можно разбить некоторые теги, где начинается $start
и $rest
. Это означает отсутствие хорошей читаемости.
$start = strip_tags(substr($entry->description, 0, 300)); $rest = strip_tags(substr($entry->description, 300), '<b><p><br>'); $start . $rest;
Мой вопрос: как я могу сохранить $start
и $rest
одинаково (без тегов) до 300 символов, а после этого $rest
отобразит форматированный пост? Есть ли другие способы сделать это?
Ниже приведен пример структуры RSS-канала (из источника страницы просмотра).
<item><guid isPermaLink="false"></guid><pubDate></pubDate><atom:updated></atom:updated><category domain=""></category><title></title><description></description><link></link><author></author></item>
Я ищу способ, который не убивает производительность.
Что-то вроде:
$start = substr($entry->description, 0, 300); if(($pos = stripos($start, "<")) !== false) { $start = strip_tags(substr($start, 0, $pos)); $rest = substr($entry->description, $pos); } else { $start = strip_tags($start); $rest = substr($entry->description, 300); }
Хорошо, это просто концепция. Получает первые 300 символов и проверяет наличие сломанного тега. Если сломано вырезать перед ним и получить $ rest с этого момента. Если не сломано, просто полоса и отдохни. Существует по крайней мере 1 проблема:
EDIT Хорошо, получи:
$start = ""; $chars = 400; while(strlen($start) < 300) { $start = strip_tags(substr($rss, 0, $chars)); $chars += 50; } $pos = stripos($rss, substr($start, strlen($start) - 50)); $rest = substr($rss, $pos+50);
Хорошо, немного противно, и есть некоторые случаи, по которым он терпит неудачу (с повторяющимся текстом, вероятно: D), проверенный на Ideone