Я пытаюсь использовать этот метод в 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; }