Как правильно получить контент и не нарушать html-теги с помощью strip_tags с substr?

На моей странице у меня есть предварительный просмотр сообщений из 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> 

Я ищу способ, который не убивает производительность.

Related of "Как правильно получить контент и не нарушать html-теги с помощью strip_tags с substr?"

Что-то вроде:

 $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 проблема:

  • вы никогда не будете теперь длиной $ start (после того, как strip_tags не может быть ничего не осталось), может использовать цикл с проверкой длины, но eeee … эффективность

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