Как правильно получить содержимое и избежать взлома HTML-тегов, используя strip_tags с substr? - PullRequest
0 голосов
/ 22 сентября 2011

На моей странице есть несколько пост-превью от 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>

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

1 Ответ

0 голосов
/ 23 сентября 2011

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

$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 символов и проверяет наличие битых тегов.Если сломан, порежь перед этим и получи $ отдых с этого момента.Если не сломано, просто разденься и отдохни.Существует по крайней мере 1 проблема:

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

РЕДАКТИРОВАТЬ Хорошо, получите это:

$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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...