[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Правильная обрезка слов
StormMan
Всем привет!
Есть такой модуль обрезки строки, это плагин для Smarty, но используются обычные функции:

<?php
function
smarty_modifier_truncate($string, $length = 80, $etc = '...',
$break_words = false, $middle = false)
{
if ($length == 0)
return '';

if (strlen($string) > $length) {
$length -= strlen($etc);
if (!$break_words && !$middle) {
$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
}
if(!$middle) {
return substr($string, 0, $length).$etc;
} else {
return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
}
}
else {
return $string;
}
}

?>


Проблема этого кода в том, что он неправильно работает с кодировкой utf-8, если символы отличаются от латиницы, и исходит эта проблема из-за того, что с многобайтными символами функция substr работать не умеет. Заменяю её на mb_substr:

<?php
function
smarty_modifier_truncate($string, $length = 80, $etc = '...',
$break_words = false, $middle = false)
{
if ($length == 0)
return '';

if (mb_strlen($string, utf8) > $length) {
//if (strlen($string) > $length) {
$length -= mb_strlen($etc, utf8);
//$length -= strlen($etc);
if (!$break_words && !$middle) {
$string = mb_ereg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1, utf8), utf8);
//$string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
}
if(!$middle) {
return mb_substr($string, 0, $length, utf8).$etc;
//return substr($string, 0, $length).$etc;
} else {
return mb_substr($string, 0, $length/2, utf8) . $etc . mb_substr($string, -$length/2, utf8);
//return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
}
}
else {
return $string;
}
}

?>


Остаётся одна проблема: слова обрезаются посередине, получается ерунда вроде "Слова обрезаются посе...". Подскажите, какие функции можно применить, чтобы текст обрезался правильно: "Слова обрезаются посередине...".

Буду очень благодарен за примеры!



Спустя 1 час, 39 минут, 1 секунда (10.06.2010 - 20:13) FatCat написал(а):
Про обрезку по ближайшему пробелу после заданной позиции: http://phpforum.ru/index.php?showtopic=0&v...ndpost&p=435266

Спустя 26 минут, 45 секунд (10.06.2010 - 20:40) StormMan написал(а):
FatCat, спасибо smile.gif Перебор - это в общем идея интересная. Подумаю, как это можно в моём случае использовать..
А функций, которые что-то подобное делают, не существует в php и mbstring?

Спустя 26 минут, 57 секунд (10.06.2010 - 21:06) FatCat написал(а):
Я лишь раз сталкивался с ситуацией, когда требовалось работать с текстов в юникоде.
Не парился, айковертнул в 1251, локаль в 1251, отработал свои функции, и результат айконвертнул обратно в юникод.

Спустя 38 минут, 1 секунда (10.06.2010 - 21:44) StormMan написал(а):
А у меня вообще все тексты всех сайтов в юникоде))) я их конвертить задолбаюсь user posted image

Спустя 1 час, 50 минут, 14 секунд (10.06.2010 - 23:35) StormMan написал(а):
Проблема практически решилась заменой строки
$string = mb_ereg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1, utf8), utf8);
на
$string = preg_replace('/\s+?(\S+)?$/u', '', mb_substr($string, 0, $length+1, utf8));
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.