Я пытаюсь получить этот метод в Строковой работе Фильтра:
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_*
функции теперь, но все неправильные результаты, к которым приводят. Это не может быть настолько трудно, таким образом, я, очевидно, пропускаю что-то. Был бы кто-то совместно использовать рабочую реализацию для этого или указывать на меня на ресурс, где я могу наконец понять, как сделать это.
Спасибо
P.S. Да, я проверил 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;
}
Но вы должны убедиться, что ваша внутренняя кодировка правильно установлена.
Мне обычно не нравится просто код всего ответа на такой вопрос. Но я только что проснулся, и я подумал, что ваш вопрос приведет меня к хорошему настроению, чтобы пройти программу до конца дня.
Я не пытался запустить это, но он должен работать или хотя бы получить вам 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;
}