[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите исправить функцию
Гость_user
Написал функцию. Она обрезает заданную строку с начала до n-го символа (задается) ровно по словам.

Если задать слово без пробелов длиннее, чем заданное количество символов, то выполнение функции по времени уходит в бесконечность.

P.S. Вместо функций с префиксами utf8_ использовать обычные.

    

function cut_from_start($string,$length)
{
$start = $length;
$string = strip_tags($string);

if ($length >= utf8_strlen($string)){
$end = utf8_strlen($string);
$dots = '';
}
else
{
while (utf8_substr($string,$start,1) != " ")
{
utf8_substr($string,$start,1);
$start = $start + 1;
};
$end = $start;
$dots = ' ...';
};
$content = utf8_substr($string,0,$end).$dots;
return $content;

};




Спустя 1 час, 1 минута, 53 секунды (28.05.2011 - 15:10) Гость_user написал(а):
Переделал сам.
Вроде неплохо получилось, кажется все варианты предусмотрел. Только логика муторная.

function cut_from_start($string,$length)
{
$start = $length;
$string = strip_tags($string);

if ($length >= utf8_strlen($string)){
$end = utf8_strlen($string);
$dots = '';
}
else
{
if(utf8_strpos($string, ' ')!=''){
while (utf8_substr($string,$start,1) != " ")
{
utf8_substr($string,$start,1);
$start = $start + 1;
};
if(($start - $length) > 15){

if(utf8_strpos(utf8_substr($string,0,$length), ' ')!=''){
$start1 = $length;
while (utf8_substr($string,$start1,1) != " ")
{
utf8_substr($string,$start1,1);
$start1 = $start1 - 1;
};
if(($length-$start1)>($start - $length)){
$start = $length;
}
else {
$start = $start1;
}

}

else {$start=$length;}

}
;
}
$end = $start;
$dots = ' ...';
};
$content = utf8_substr($string,0,$end).$dots;
return $content;

};

Спустя 2 часа, 1 минута, 14 секунд (28.05.2011 - 17:11) Гость_user написал(а):
Знатоки, оцените, поправьте.
Может лучше варианты есть? Поделитесь.

Спустя 3 часа, 19 минут, 45 секунд (28.05.2011 - 20:31) ИНСИ написал(а):
Гость_user ну не знаю :) Что у тебя получилось, но я бы сделал так:

    function strCrop($str, $maxlen, $char = '...')
{
$str = trim($str);
mb_internal_encoding('UTF-8');
if(mb_strlen($str) > $maxlen)
return mb_substr($str, 0, $maxlen) . $char;
else
return
$str;
}

Спустя 11 минут, 42 секунды (28.05.2011 - 20:43) Status-X написал(а):
Сообщение самоудалилось!

Спустя 20 минут, 24 секунды (28.05.2011 - 21:03) Status-X написал(а):
Сообщение самоудалилось!

Спустя 5 минут, 54 секунды (28.05.2011 - 21:09) ИНСИ написал(а):
Цитата
Ну это будет не резка по словам, а резка по количеству символов.

Мне кажется автор темы хочет реализовать резку по количеству символов. Если сделать резку слова, то как-то так:
function strWrap($str, $maxlen = 10, $sep = ' ') {
mb_internal_encoding('UTF-8');
if($maxlen > 0 && mb_strlen($str) > $maxlen) {
$str = @ereg_replace("([^] \[\(\)\n\r\t\-\%\!\?\{\}]{".$maxlen."})","\\1" . $sep, $str);
}
return $str;
}

Спустя 1 минута, 49 секунд (28.05.2011 - 21:11) ИНСИ написал(а):
Цитата
function getCutWord($text, $count, $char = '...') {
if(strlen($text) > $count) {
$text = substr($text, 0, $count);
$text = explode(' ', $text);
array_pop($text);
$text = implode(' ', $text);
}
return $text . $char;
}

А что будет, если я захочу разбить русские символы? Думаю твоя функция, даст сбой smile.gif

Спустя 3 минуты, 34 секунды (28.05.2011 - 21:15) Status-X написал(а):
Сообщение самоудалилось!

Спустя 10 минут, 33 секунды (28.05.2011 - 21:25) inpost написал(а):
velbox
ereg - устаревшая библиотека, нужно использовать только preg

Спустя 4 минуты, 38 секунд (28.05.2011 - 21:30) Гость_user написал(а):
Спасибо за подсказки, но проблему решил проще, чем задумал сначала.

Аналогов приведенной функции по возможностям не нашел. Но как оказалось все эти возможности не нужны.

А задумывал вот что (сделал все, но функция иногда сбоит):
1. Резка по заданному количеству символов с начала. Если резка попадает на середину слова, то слово режется не на середине, а захватывается полностью.
2. Если введено одно длиииное неразрывное слово слово, то резка просто по количеству символов.
3. Если резка попадает на единичное очень длинное слово в середине текста, то осуществляется прохождение по этому слову далее по тексту и если через 15 символов (среднестатистическое слово) не встречается пробела, то считаем, что слово очень длинное и осуществляем проходку от места разрыва по этому слову, только в обратном направлении и если расстояние от места разрыва до пробела в обратном направлении меньше чем в прямом, то режем по этому месту. Если же нет, то просто режем по количеству заданных символов.
4. Добавление многоточия, если строка обрывается.

Заколебался с этой логикой и сделал вот что:
Взял здесь на сайте функцию twin'а mbWordwrap. Обрабатываю ею строку перед записью в базу. А при выводе отображаю строку не по количеству символов а по количеству слов.

Спустя 3 минуты, 23 секунды (28.05.2011 - 21:33) ИНСИ написал(а):
Цитата
velbox ты ж эксперт, а несешь ерунду, это пионеры будут долго думать что с мультибайтами делать:D

Блин, как меня разражает, когда люди начинают "бычиться". Ты, дал функцию, которая не будет работать корректно всегда. Если ты знаешь как все сделать правильно, так чего же не сделаешь сразу? И при чем тут мой статус?

Цитата
Да и кто сказал что я буду на сайте с UTF например функцию использовать

Надо было посмотреть код автора. Видно, что человек рассчитывает и на русские символы, но с твоей функцией, нифига не получится.

Цитата
ereg - устаревшая библиотека, нужно использовать только preg

Согласен smile.gif Просто функцию давно писал smile.gif

Спустя 9 минут, 10 секунд (28.05.2011 - 21:42) Status-X написал(а):
Сообщение самоудалилось!
Быстрый ответ:

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