代码之家  ›  专栏  ›  技术社区  ›  Gordon Haim Evgi

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

  •  7
  • Gordon Haim Evgi  · 技术社区  · 15 年前

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

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

    我希望这样

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

    而且这个

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

    那就是 $chars 减去 $terminator 字符串。

    此外,过滤器应该在 $CARS 极限,例如

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

    我很确定这应该和这些步骤一起工作

    • 从最大字符中减去终止符中的字符数
    • 验证字符串是否长于计算的限制,或返回未更改的字符串
    • 查找字符串中低于计算限制的最后一个空格字符以获取单词边界
    • 如果找不到最后一个空格,则在最后一个空格处剪切字符串或计算出的限制
    • 将终止符附加到字符串
    • 返回字符串

    但是,我尝试了各种组合 str* mb_* 现在的函数,但都产生了错误的结果。这不难,所以我显然错过了一些东西。会有人为此共享一个有效的实现吗? 向我指出一个资源,在那里我最终可以理解如何做。

    谢谢

    是的,我查过了 https://stackoverflow.com/search?q=truncate+string+php 之前:)

    3 回复  |  直到 15 年前
        1
  •  3
  •   Gumbo    15 年前

    试试这个:

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

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

        2
  •  5
  •   Gordon    14 年前

    刚刚发现php已经用

    但它不遵守单词边界。不过还是很方便!

        3
  •  0
  •   SoapBox    15 年前

    我通常不喜欢这样一个问题的完整答案。但我也刚醒过来,我想也许你的问题会让我心情很好,可以在一天的剩余时间去参加节目。

    我没有试着运行这个,但它应该可以工作,或者至少让你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;
    }