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

我想在一个stringfilter工作中得到这个方法:

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

我期待这一点

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

也是这个

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

那就是$chars减去$terminatorstring的字符。

此外,filter应该在$chars限制之下的第一个字边界处切割,例如

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

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

  • 从最大字符中减去终止符中的字符数量
  • validation该string是否长于计算的限制或返回不变
  • findstring中最后一个空格字符,计算下限得到字边界
  • 如果没有find最后一个空格,则在最后一个空格处剪切string或计算限制
  • 追加终止符到string
  • 返回string

不过,我已经尝试了str*mb_*函数的各种组合,但都产生了错误的结果。 这不是那么困难,所以我显然错过了一些东西。 会有人分享一个工作实施这个指向我的资源,我终于明白如何做到这一点。

谢谢

PS是的,我已经检查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已经有一个多字节截断与

  • mb_strimwidth – 获取指定宽度的截断string

尽pipe如此,它并不服从字面界限。 但方便!

我通常不喜欢只编写一个完整的答案来解决这个问题。 但是我也刚刚醒来,而且我想也许你的问题会让我心情愉快,在今天剩下的时间里去做节目。

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