Усечение многобайтовой строки в n символов

Я пытаюсь использовать этот метод в String Filter:

public function truncate($string, $chars = 50, $terminator = ' …'); 

Я бы ожидал этого

 $in = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYXZ1234567890"; $out = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV …"; 

а также

 $in = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝ"; $out = "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđ …"; 

Это $chars минус символы строки $terminator .

Кроме того, фильтр должен разрезать на границе первого слова ниже предела $chars , например

 $in = "Answer to the Ultimate Question of Life, the Universe, and Everything."; $out = "Answer to the Ultimate Question of Life, the …"; 

Я вполне уверен, что это должно работать с этими шагами

  • вычитание количества символов в терминаторе из максимальных символов
  • подтвердите, что строка длиннее расчетного предела или возвращает его неизменным
  • найдите последний пробел в строке ниже вычисленного предела, чтобы получить границу слова
  • вырезать строку в последнем пробеле или рассчитать предел, если последнее место не найдено
  • Добавить терминатор в строку
  • строка возврата

Тем не менее, я уже пробовал различные комбинации функций str* и mb_* , но все они дали неверные результаты. Это не может быть так сложно, поэтому я, очевидно, что-то пропустил. Будет ли кто-то распространять рабочую реализацию для этого или указать мне на ресурс, где я наконец смогу понять, как это сделать.

благодаря

PS Да, я проверил https://stackoverflow.com/search?q=truncate+string+php раньше 🙂

    Попробуй это:

     function truncate($string, $chars = 50, $terminator = ' …') { $cutPos = $chars - mb_strlen($terminator); $boundaryPos = mb_strrpos(mb_substr($string, 0, mb_strpos($string, ' ', $cutPos)), ' '); return mb_substr($string, 0, $boundaryPos === false ? $cutPos : $boundaryPos) . $terminator; } 

    Но вы должны убедиться, что ваша внутренняя кодировка установлена ​​правильно.

    Просто выяснилось, что PHP уже имеет многобайтовое усечение с

    • mb_strimwidth – Получить усеченную строку с указанной шириной

    Однако он не подчиняется границам слов. Но, тем не менее, полезно!

    Обычно мне не нравится просто комментировать весь ответ на такой вопрос. Но также я просто проснулся, и я подумал, что, может быть, ваш вопрос заставит меня настроиться на программу до конца дня.

    Я не пытался запустить это, но он должен работать или, по крайней мере, получить вам 90% пути.

     function truncate( $string, $chars = 50, $terminate = ' ...' ) { $chars -= mb_strlen($terminate); if ( $chars <= 0 ) return $terminate; $string = mb_substr($string, 0, $chars); $space = mb_strrpos($string, ' '); if ($space < mb_strlen($string) / 2) return $string . $terminate; else return mb_substr($string, 0, $space) . $terminate; }