我想得到这个方法在一串的过滤工作:

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

我期待这个

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

也和这个

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

就是 $chars 减字的 $terminator string.

此外,该过滤器应该来切第一词边界的下面 $chars 限,例如

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

我很肯定这一工作应该与这些步骤

  • 减去的数额的chars在终结者从最高字符
  • 验证串的时间比计算的限额或返回的未改变
  • 找到最后一个空间字符串中以下计算的限制,以获得的词边界
  • 切断串在最后一个空间或计算的限制,如果没有最后的空间是发现
  • 追加的终结者串
  • 回字符串

然而,我已经尝试了各种组合 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;
}

但你需要确保内部编码是正确的设定。

其他提示

只是发现了PHP已经有一个多truncate与

它不遵守词的边界。但是方便的,尽管如此!

我通常不喜欢只是代码整个回答一个问题像这一点。而且我刚刚醒来的时候,和我以为也许你的问题将会让我心情好转的程序,用于其余的一天。

我没有尝试运行这一点,但它应工作,或者至少得到你的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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top