Усеките байтовую строку к n символам

Я пытаюсь получить этот метод в Строковой работе Фильтра:

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 …";

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

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

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

Спасибо

P.S. Да, я проверил https://stackoverflow.com/search? q=truncate+string+php прежде :)

7
задан Community 23 May 2017 в 11:58
поделиться

2 ответа

Попробуйте:

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;
}

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

3
ответ дан 7 December 2019 в 05:22
поделиться

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

Я не пытался запустить это, но он должен работать или хотя бы получить вам 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;
}
0
ответ дан 7 December 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: