Если пользоваться функцией
substr при "обрезании" части текста, например для того чтобы вывести превью новостей, иногда последние символы отображаются
значком вопроса в ромбике или каким нибудь другим краказяблом. Такое безобразие происходит в частности с
русскими текстами в юникодовской кодировке. Объясняется это тем что, как правильно заметил товарищ
Макс, в данном случае сам текст содержит больше байт, нежели количество символов.
В самой статье достаточно много вариантов решения вопроса, сдесь же мне хотелось бы выложить модифицированную функцию где текст урезается не только по словам , но и по символам в случае если текст длиннннннее заданного количества
$maxchar.
Аргументы:
$text - исходный текст,
$maxwords - максимальное количество слов,
$maxchar - максимальное количество символов. Последние два параметра не обязательны т.к. функция содержит дефолтные значения.
- "Чистим" текст от лишних тэгов HTML (в превюшке они не нужны).
- Создаем массив состоящий из слов нашего текста.
- Считаем количество символов в тексте, учитывая кодировку строки.
- Если количество слов превышает макимально допустимое - "урезаем" массив слов до заданной велечины $maxwords.
- Если количество символов превышает макимально допустимое - "урезаем" стоку заданной велечины $maxchar.
function getPrewText( $text, $maxwords = 30, $maxchar = 300 ){
$text = strip_tags( $text );
$words = split( ' ', $text );
$char = iconv_strlen( $text, 'utf-8' );
if ( count( $words ) > $maxwords ){
$text = join( $sep, array_slice($words, 0, $maxwords ));
}
if ( $char > $maxchar ){
$text = iconv_substr( $text, 0, $maxchar, 'utf-8' );
}
return $text;
}
Теги: php, примочки Кирпич цена, двойной
тротуарная брусчатка пустотелый Киев. Штраф под кирпич.
Эта запись опубликована: Вторник, 21 октября 2008 в рубрике PHP.
4 комментария
Для работы с UTF-8 я бы лучше всего использовал функцию mb_substr. Конечно не на всех хостингах включено использование mb но в PHP6 по дефолту будет использоваться UTF-8.
что то у меня эта фунцция выводит все слова без пробелов...
аа... разобрался...
спасибо
я у себя делаю так :
чищу текст от тегов и лишних пробелов
разбиваю на предложения ( explode(". ",... ) )
и вывожу склейку первых 2-4 элементов полученного массива