Если задать слово без пробелов длиннее, чем заданное количество символов, то выполнение функции по времени уходит в бесконечность.
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; } |
А что будет, если я захочу разбить русские символы? Думаю твоя функция, даст сбой
Спустя 3 минуты, 34 секунды (28.05.2011 - 21:15) Status-X написал(а):
Сообщение самоудалилось!
Спустя 10 минут, 33 секунды (28.05.2011 - 21:25) inpost написал(а):
velbox
ereg - устаревшая библиотека, нужно использовать только preg
ereg - устаревшая библиотека, нужно использовать только preg
Спустя 4 минуты, 38 секунд (28.05.2011 - 21:30) Гость_user написал(а):
Спасибо за подсказки, но проблему решил проще, чем задумал сначала.
Аналогов приведенной функции по возможностям не нашел. Но как оказалось все эти возможности не нужны.
А задумывал вот что (сделал все, но функция иногда сбоит):
1. Резка по заданному количеству символов с начала. Если резка попадает на середину слова, то слово режется не на середине, а захватывается полностью.
2. Если введено одно длиииное неразрывное слово слово, то резка просто по количеству символов.
3. Если резка попадает на единичное очень длинное слово в середине текста, то осуществляется прохождение по этому слову далее по тексту и если через 15 символов (среднестатистическое слово) не встречается пробела, то считаем, что слово очень длинное и осуществляем проходку от места разрыва по этому слову, только в обратном направлении и если расстояние от места разрыва до пробела в обратном направлении меньше чем в прямом, то режем по этому месту. Если же нет, то просто режем по количеству заданных символов.
4. Добавление многоточия, если строка обрывается.
Заколебался с этой логикой и сделал вот что:
Взял здесь на сайте функцию twin'а mbWordwrap. Обрабатываю ею строку перед записью в базу. А при выводе отображаю строку не по количеству символов а по количеству слов.
Аналогов приведенной функции по возможностям не нашел. Но как оказалось все эти возможности не нужны.
А задумывал вот что (сделал все, но функция иногда сбоит):
1. Резка по заданному количеству символов с начала. Если резка попадает на середину слова, то слово режется не на середине, а захватывается полностью.
2. Если введено одно длиииное неразрывное слово слово, то резка просто по количеству символов.
3. Если резка попадает на единичное очень длинное слово в середине текста, то осуществляется прохождение по этому слову далее по тексту и если через 15 символов (среднестатистическое слово) не встречается пробела, то считаем, что слово очень длинное и осуществляем проходку от места разрыва по этому слову, только в обратном направлении и если расстояние от места разрыва до пробела в обратном направлении меньше чем в прямом, то режем по этому месту. Если же нет, то просто режем по количеству заданных символов.
4. Добавление многоточия, если строка обрывается.
Заколебался с этой логикой и сделал вот что:
Взял здесь на сайте функцию twin'а mbWordwrap. Обрабатываю ею строку перед записью в базу. А при выводе отображаю строку не по количеству символов а по количеству слов.
Спустя 3 минуты, 23 секунды (28.05.2011 - 21:33) ИНСИ написал(а):
Цитата |
velbox ты ж эксперт, а несешь ерунду, это пионеры будут долго думать что с мультибайтами делать:D |
Блин, как меня разражает, когда люди начинают "бычиться". Ты, дал функцию, которая не будет работать корректно всегда. Если ты знаешь как все сделать правильно, так чего же не сделаешь сразу? И при чем тут мой статус?
Цитата |
Да и кто сказал что я буду на сайте с UTF например функцию использовать |
Надо было посмотреть код автора. Видно, что человек рассчитывает и на русские символы, но с твоей функцией, нифига не получится.
Цитата |
ereg - устаревшая библиотека, нужно использовать только preg |
Согласен Просто функцию давно писал
Спустя 9 минут, 10 секунд (28.05.2011 - 21:42) Status-X написал(а):
Сообщение самоудалилось!