一尘不染

将多字节字符串截断为n个字符

php

我正在尝试在字符串过滤器中使用此方法:

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_*函数的各种组合,但是都产生了错误的结果。这不是那么困难,所以我显然缺少了一些东西。有人会为此共享一个可行的实施方案,
还是 将我指向一个资源,使我最终能够理解如何做到这一点。

谢谢


阅读 313

收藏
2020-05-26

共1个答案

一尘不染

尝试这个:

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

但是您需要确保正确设置内部编码。

2020-05-26