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

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

  • 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 ...

Новости

  • Вчера, 09:47
  • В преддверии 2025 года была выпущена сборка 7.2.5, которая не приносит радикальных изменений в функциональности, но способствует повышению стабильности работы системы и расширению возможностей облачного сервиса для создания сайтов.
  • 18 июня 2024 г.
  • В сборке большое обновление demo-шаблона, дополнительная защита от спама, улучшение YML-импорта и еще много важного и интересного.
  • 24 апреля 2024 г.
  • В новой сборке совершили революцию в структурировании кастомизированной информации в шаблонах, добавили авторегистрацию пользователей, усовершенствовали защиту от спама, актуализировали накопительную скидку, а также улучшили производительность и стабильность работы системы.