Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Обрезание строки не обрезая слово
 
 автор: TetRiska   (01.04.2011 в 02:37)   письмо автору
 
 

Всем привет. Хочу услышать критику по поводу моей ф-ции, которая режет строку по заданному размеру не урезая при этом слово и в добавок ставит троеточие если в исходной строке больше символов чем мы обрезаем.
function strok_replace($str='',$length=0){
    $exp_str = explode(" ",$str);
    $plength = 0;
    $j = 0;
    for($i=0;$i<count($exp_str);$i++){
        $j++;
        $nbsp = ($j!=count($exp_str))?" ":"";
        $plength += mb_strlen($exp_str[$i],'UTF-8')+1;
        if($plength <= $length){
            $strok .= $exp_str[$i].$nbsp;
        }else{
            $strok = $strok.'...';
            break;  
        }
    }
    return $strok;
}

  Ответить  
 
 автор: alexander95   (01.04.2011 в 02:54)   письмо автору
 
   для: TetRiska   (01.04.2011 в 02:37)
 

<?
function string_replace($string,$length=256)
{
  for(
$i=$length;$string[$i] == ' ';$i++)
    if(
$string[$i]=='\0')
      return 
$string;
  
$string[$i++].='.';
  
$string[$i++].='.';
  
$string[$i++].='.';
  
$string[$i].='\0';
  return 
$string;
}
?>


только не надо говорить, что это шлак - сам знаю,но - как вариант покатит:)

  Ответить  
 
 автор: ONYX   (01.04.2011 в 10:48)   письмо автору
 
   для: TetRiska   (01.04.2011 в 02:37)
 

<?
function cut($string,$len){
  
$count strlen($string); //определяем длинну строки
  
$index strpos($string,' ',$len); #определяем первую позицию пробела, после указанной позиции
  
if($len $count || !$index) return $string//если указанная длинна больше длинны строки, или не найден пробел после заданной позиции, возвращаем строку
  
return substr($string,0,$index).($index strlen($string)?'&nbsp;&hellip;':'&nbsp;'); //обрезаем строку, если надо добавляем три точки
}
?>


тоже вариантик на крайний случай

  Ответить  
 
 автор: ONYX   (01.04.2011 в 10:55)   письмо автору
 
   для: TetRiska   (01.04.2011 в 02:37)
 

Делаю запрос к вашей функции:
<?
echo strok_replace('Привет мой старый друг',10);
?>


Результат: Привет мой старый ...
Должно быть: Привет мой…

  Ответить  
 
 автор: TetRiska   (01.04.2011 в 17:59)   письмо автору
 
   для: ONYX   (01.04.2011 в 10:55)
 

не мой, не Ваш методы некорректны)

  Ответить  
 
 автор: alexander95   (01.04.2011 в 18:24)   письмо автору
 
   для: TetRiska   (01.04.2011 в 17:59)
 

а мой? извините,не имею сейчас возможности проверить..

  Ответить  
 
 автор: TetRiska   (01.04.2011 в 18:47)   письмо автору
 
   для: alexander95   (01.04.2011 в 18:24)
 

Cannot use assign-op operators with overloaded objects nor string offset

  Ответить  
 
 автор: alexander95   (01.04.2011 в 18:56)   письмо автору
 
   для: TetRiska   (01.04.2011 в 18:47)
 

Конечно же!
<? 
function string_replace($string,$length=256

  for(
$i=$length;$string{$i} == ' ';$i++) 
    if(
$string{$i}=='\0'
      return 
$string
  
$string{$i++}.='.'
  
$string{$i++}.='.'
  
$string{$i++}.='.'
  
$string{$i}.='\0'
  return 
$string

?>

  Ответить  
 
 автор: TetRiska   (01.04.2011 в 18:33)   письмо автору
 
   для: TetRiska   (01.04.2011 в 17:59)
 

Исправил свое творение, пару нюансов недосмотрел
function strok_replace($str='',$length=0){
    $exp_str = explode(" ",$str);
    $count   = count($exp_str);
    $plength = 0;
    $j       = 0;
    $p       = 0;
    $length  = abs(intval($length));
    for($i=0;$i<$count;$i++){
        $j++;
        $nbsp = ($j!=$count)?" ":"";
        $add  = ($p != $i)?1:0;
        $plength += mb_strlen($exp_str[$i],'UTF-8')+$add;
        if($plength <= $length){
            $strok .= $exp_str[$i].$nbsp;
        }else{
            $strok = $strok!=''?$strok.'...':$exp_str[$i];
            break;  
        }
    }
    return $strok;
}

Вызываем
echo strok_replace('Привет мой старый друг',5); // Привет
echo strok_replace('Привет мой старый друг',6); // Привет ...
echo strok_replace('Привет мой старый друг',9); // Привет ...
echo strok_replace('Привет мой старый друг',10); // Привет мой ...
echo strok_replace('Привет мой старый друг',16); // Привет мой ...
echo strok_replace('Привет мой старый друг',17); // Привет мой старый ...
echo strok_replace('Привет мой старый друг',21); // Привет мой старый ...
echo strok_replace('Привет мой старый друг',22); // Привет мой старый друг

  Ответить  
 
 автор: mikha   (05.04.2011 в 06:20)   письмо автору
 
   для: TetRiska   (01.04.2011 в 18:33)
 

Решил слегка размять мозг))
<?php
$str 
'Текст почикал, а то страницу козявит';

$num 20;

for(
$len mb_strlen($str'utf-8'), $i 0$res ''$i <= $len$i++){
  if(
mb_strlen($res'utf-8') >= $num and in_array($str[$i], array('.'',''!'' '))) break;
  
$res .= $str[$i];
}
echo 
$res;
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования