За последние 24 часа нас посетили 22043 программиста и 1143 робота. Сейчас ищут 646 программистов ...

Подскажите как грамотно обрезать строку - Решено;) -

Тема в разделе "PHP для новичков", создана пользователем lodyr, 14 авг 2010.

  1. lodyr

    lodyr Активный пользователь

    С нами с:
    14 авг 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Москва
    приветствую всех!
    извиняюсь за вопрос, пхп совсем не знаю
    сейчас делаю сайт на амиро, возникла необходимость в заголовке отрезать строку
    нашел в инете решение, вот такое
    Код (Text):
    1. <?php
    2. $string = 'Это строка которую нужно урезать';
    3. $result = implode(array_slice(explode('<br>',wordwrap($string,21,'<br>',false)),0,1));
    4. echo $result;
    5. if($result!=$string)echo'...';
    6. // выведет "Это строка которую..."
    7. ?>
    вроде все режет, но немного не правильно, помогите подкорректировать
    сайт в кодировке utf-8, получается этот код режет немного не то кол-во знаков, это ладно можно методом тыка подобрать, проблема в другом
    У меня вот такой заголовок
    Заправка картриджей Q2612A для HP LJ 1010, 1012, 1015
    мне надо чтобы отрезало до 45 знаков, если это середина слова, то соответственно резало по последнему целому слову и если попадется в конце запятая, то чтобы ее откидывало и в конце ставило три точки
    т.е. должно получиться
    Заправка картриджей Q2612A для HP LJ 1010...
    подскажите
    и если кто вдруг знаком с амиро, подскажите как засунуть в шаблон амиро кусок кода пхп, просто функцию пхп я понимаю как вставить, а код целиком пока непонятно
     
  2. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Для обрезания строки используется функция http://php.net/substr
    Это уже простая логика, ничего сложного нет.
     
  3. lodyr

    lodyr Активный пользователь

    С нами с:
    14 авг 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Москва
    ага, только эта функция просто режет и все, на половине слова, хотелось бы чтобы она грамотно отрезала, после слова и убирала запятую после слова
     
  4. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    тебе ж написали про логику
     
  5. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Что-то типа так:
    PHP:
    1. <?
    2. $text = substr($text,0,45);
    3. $i=strlen(trim($text));
    4. $s = false;
    5.             while($s && $i>0) {
    6.                 if (substr($text,$i-1,1)==' ')
    7.                     $s = true;
    8.                 $text = substr($text,0,-1);
    9.                 $i--;
    10.             }
    11. $text .= '...';
    12. ?>
     
  6. lodyr

    lodyr Активный пользователь

    С нами с:
    14 авг 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Москва
    а проще никак нельзя?
    просто тот код который я привел он почти в одну строку делает все что надо, только запятую не удаляет
    думал его можно как-то подправить и готово)
     
  7. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    ты себе правильный ник выбрал
     
  8. Devzirom

    Devzirom Активный пользователь

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
    можно, если вы сами неплохо разбираетесь в регулярных выражения, или знаете того кто сможет вам помочь.
     
  9. lodyr

    lodyr Активный пользователь

    С нами с:
    14 авг 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Москва
    про ник это да)))
    просто все это запихивать в шаблон мне кажется очень большим
    вот пример запихивания кода из первого поста
    Код (Text):
    1. <!--#set var="small_special_row" value="
    2. <li>
    3. ##--class="##if(urgent)##eshop_list_urgent_small_special_row##else##eshop_list_small_special_row##endif##"--##
    4.     <b><a href="##eshop_catalog_script####nav_data##">
    5. ##--name--##
    6. ##setvar @string = name##
    7. ##setvar @result = implode(array_slice(explode('<br>',wordwrap(string,80,'<br>',false)),0,1))##
    8. ##result####if(result!=string)##...##endif##</a></b>
    а ваш вставить еще больше, думал можно просто как-то проблему решить
    регулярные выражения не знаю, знаю что там только куча символов и ничего не понятно
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
  11. lodyr

    lodyr Активный пользователь

    С нами с:
    14 авг 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Москва
    спасибо за вариант, но запятая на конце слова не отрезается

    подскажите плиз, как правильно составить регулярное выражение для поиска запятой, пока читаю, но не догоняю
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
  13. lodyr

    lodyr Активный пользователь

    С нами с:
    14 авг 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Москва
    igordata
    спасибо большое!
    работает)

    вроде работает, но все равно спрошу
    ф-ция trim для вырезания запятой так должна выглядеть trim(string, '\,') или для запятой должен использоваться код?

    igordata
    еще косячок вылез, если строка меньше кол-ва отрезаемых символов, то эта строка то же режется, видимо по второму проходу
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    lodyr
    если меньше - ты должен проверять длину, и запускать обрезку только если больше.
     
  15. lodyr

    lodyr Активный пользователь

    С нами с:
    14 авг 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Москва
    еще, если не сложно, подскажите плиз
    выводимая строка в кодировке UTF-8, все эти ф-ции, немного не корректно работают с этой кодировкой
    как надо поступить? перекодировать строку в win-1251 и использовать выше приведенные ф-ции или использовать специальные функции для многобайтовой кодировки?
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
  17. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    UTF-8 - двухбайтовая кодировка. strlen и ему подобные функции возвращают количество байт в строке.
    Логично предположить, что количество байт должно быть умножено на два.
    Нужно получить подстроку длиной 6 символов, начиная со второго?
    Второй символ находится в позиции 2*2, 6 символов - 2*6 байт.
    Или использовать функции mbstring
     
  18. lodyr

    lodyr Активный пользователь

    С нами с:
    14 авг 2010
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Москва
    вообщем получилась вот такая конструкция
    Код (Text):
    1. $cut_text=trim(mb_substr(text,0,mb_strrpos(mb_substr(text,0,45,'utf-8'),' ',utf-8),'utf-8'), '\,');
    а условие по длине строки проверяется при помощи ф-ции mb_strlen
    вроде все работает,
    большое всем спасибо!

    Apple
    щас еще попробую переписать под однобайтовые функции, проверю

    попробовал, не получается, как-то хитро режет, наверное, встречаются однобайтовые символы, вообщем строка получается длиннее чем надо
    при явном указании при utf-8 45 символов, отрезает ровно 45 символов, при использовании однобайтовых ф-ций такой же результат получается при указании 68 символов
    еще раз всем спасибо!
     
  19. tjobs

    tjobs Новичок

    С нами с:
    18 мар 2014
    Сообщения:
    1
    Симпатии:
    0
    Адрес:
    Москва
    Более правильно сделать так: (предложенный ранее код работает не всегда правильно):
    Код (Text):
    1.  
    2. function TrimText($text, $max_text){
    3.   $text = str_replace("  ", " ", $text);
    4.   $string = explode(" ", $text);
    5.   $count = 100;
    6.   for ($wordCounter = 0; $wordCounter <= $count;$wordCounter++) {
    7.   $trimed .= $string[$wordCounter];
    8.   if(strlen($trimeed) >= $max_text) break;
    9.     if($wordCounter < $count){
    10.       $trimed .= " ";
    11.     }
    12.   }
    13.   $trimed = trim($trimed);
    14.   return $trimed;
    15. }
    Ну и в коде ставим:
    Код (Text):
    1.  
    2. $description = TrimText($description, 70);
    70 - это максимальная длинна строки

    P.S. код может быть грязноват - так что если есть желанее - можете его доработать.
     
  20. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА