题
我想得到这个方法在一串的过滤工作:
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;
}
但你需要确保内部编码是正确的设定。
其他提示
我通常不喜欢只是代码整个回答一个问题像这一点。而且我刚刚醒来的时候,和我以为也许你的问题将会让我心情好转的程序,用于其余的一天。
我没有尝试运行这一点,但它应工作,或者至少得到你的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;
}
不隶属于 StackOverflow