Вход • Регистрация

Как корректно обрезать длину сообщения в блоке "Последние сообщения форума"?

  • 12 марта 2014 г. , редакция: 12 марта 2014 г.
  • Есть у меня вот такая конструкция:
    Код
    echo '<div class="forum_link"><a href="'.BASE_PATH_HREF.$row["link"].'">'.substr($row['text'], 0, 100).'</a></div>';

    работает, обрезает ровно через 100 символов.
    1. Но у последнего символа бьется кодировка, рисует вместо символа знак вопроса, если обрезает не на пробеле.
    2. Как можно сделать, чтобы обрезало целыми словами, а не ровно в 100 символов?
    • 13 марта 2014 г.
    • 1. У Вас substr работает (считает) с байтами, а не с символами. А текст у Вас, скорее всего, в UTF-8, то есть кириллица храниться несколькими байтами. Там где предполагаете работу с русским текстом используйте семейство mbstring-функций:
      Код
      echo '<div class="forum_link"><a href="'.BASE_PATH_HREF.$row["link"].'">'.mb_substr($row['text'], 0, 100, 'utf-8').'</a></div>';

      Можно включить автоматическую перегрузку всех строковых функций (mbstring.func_overload в php.ini)
      2. Разбейте строку на массив слов по пробелам и посчитайте число символов в словах, например:
      Код
      // $inpstring входная строка, $outstring строка, имеющая не более maxchars символов, кратно словам
      function calcwords(&$rc, $word) {
      if ( ($rc['count']+=mb_strlen($word, 'utf-8')) < $rc['maxchars'] ) $rc['string'] .= ' '.$word;
      return $rc;
      }
      $rc = array_reduce(explode(' ', $inpstring), 'calcwords', array('count'=>0, 'string'=>'', 'maxchars'=>100));
      $outstring = trim($rc['string']);

      • 13 марта 2014 г.
      • Спасибо!
        Первый вариант работает. Битой кодировки нет.
        А вот как использовать вашу вторую конструкцию, представления не имею
        • 13 марта 2014 г.
        • Например, так
          Код
          function cw1394698435(&$rc, $word) {
          if ( ($rc['count']+=mb_strlen($word, 'utf-8')+1) < $rc['maxchars'] ) $rc['string'] .= ' '.$word;
          return $rc;
          }
          $rc1394698435 = array_reduce(explode(' ', strip_tags($row['text'])), 'cw1394698435', array('count'=>0, 'string'=>'', 'maxchars'=>100));
          echo '<div class="forum_link"><a href="'.'BASE_PATH_HREF'.$row["link"].'">'.trim($rc1394698435['string']).'</a></div>';

      • 13 марта 2014 г.
      • А вот mbstring.func_overload стоит ли включать? Допустим, для битрикса в utf-8 использую mbstring.func_overload 2, но прописываю для каждого хоста в конфиге апача.
        Помню, что при включении mbstring.func_overload у меня падал форум на IPB, если включал в php.ini ...

Новости

  • 12 января
  • После выхода сборки 7.1 мы выпустили уже три патча, в каждом из которых улучшаем административную часть сайта. Сборка DIAFAN.CMS 7.1.3 уже доступна к установке. 
  • 15 декабря 2023 г.
  • Подводим итоги 2023 года. Выпустили новую сборку DIAFAN.CMS 7.1.1, вводим новые тарифы на аренду сайта и коммерческую поддержку и автообновления с января 2024 г., строим планы на будущий год.
  • 25 июля 2023 г.
  • Выпустили очередную сборку DIAFAN.CMS 7.0.1. Она уже доступна к установке.

Блоги

  • 15.12.2023
  • В новой сборке DIAFAN.CMS 7.1.1 мы расширили функциональность баннеров, уделили внимание YML-фиду для Яндекс.Маркет, улучшили “Настройки шаблона”, оформили модуль лога действий и разработали “Заметки” для пользователей административной части сайта. Также проработали замечания и предложения наших пользователей, исправили несколько ошибок.

Форум