21

我有两个字符串,我想限制为例如前 25 个字符。有没有办法在第 25 个字符之后截断文本并在字符串末尾添加一个 ...?

所以 '12345678901234567890abcdefg' 将变成 '12345678901234567890abcde...' 其中 'fg' 被切断。

4

11 回答 11

50

我可以修改pallan的代码吗?

$truncated = (strlen($string) > 20) ? substr($string, 0, 20) . '...' : $string;

如果它更短,这不会添加“...”。

于 2009-08-06T20:33:59.470 回答
10

为避免在单词中间切入,您可能想尝试该wordwrap功能;我想,这样的事情可以做到:

$str = "this is a long string that should be cut in the middle of the first 'that'";
$wrapped = wordwrap($str, 25);
var_dump($wrapped);

$lines = explode("\n", $wrapped);
var_dump($lines);

$new_str = $lines[0] . '...';
var_dump($new_str);

$wrapped将包含:

string 'this is a long string
that should be cut in the
middle of the first
'that'' (length=74)

$lines数组将如下所示:

array
  0 => string 'this is a long string' (length=21)
  1 => string 'that should be cut in the' (length=25)
  2 => string 'middle of the first' (length=19)
  3 => string ''that'' (length=6)

最后,您的$new_string

string 'this is a long string' (length=21)


使用 substr,如下所示:

var_dump(substr($str, 0, 25) . '...');

你会得到:

string 'this is a long string tha...' (length=28)

这看起来不太好:-(


不过,玩得开心!

于 2009-08-06T20:38:24.843 回答
9

真的很快,

$truncated = substr('12345678901234567890abcdefg', 0, 20) . '...'
于 2009-08-06T20:31:02.423 回答
8

这个很短并且考虑到了单词边界,它不使用循环,这使得它非常有效

function truncate($str, $chars, $end = '...') {
    if (strlen($str) <= $chars) return $str;
    $new = substr($str, 0, $chars + 1);
    return substr($new, 0, strrpos($new, ' ')) . $end;
}

用法:

truncate('My string', 5); //returns: My...
于 2015-07-17T10:53:32.977 回答
6

http://php.net/manual/en/function.mb-strimwidth.php (PHP 4 >= 4.0.6, PHP 5, PHP 7)

<?php
echo mb_strimwidth("Hello World", 0, 10, "...");
echo "<br />";
echo mb_strimwidth("Hello", 0, 10, "...");
?>

输出:

Hello W...
Hello
于 2017-01-14T14:41:53.003 回答
2
$words=explode(' ', $string);
for($ii = 0,$j=0; $ii< 5 && $j < sizeof($words) ;$j++){
    $ii += strlen($words[$j]);
    $intro= $words[$j]. " ";    
}
$intro.= "...";

我知道它为时已晚,但如果其他人返回此页面,这会做,

于 2010-12-29T06:54:54.583 回答
1

我会接受 Pascal MARTIN 的回答,并进行一些额外的改进。因为;

1 - “PHP wordwrap”,自动尊重单词边界

2 - 如果您的字符串包含超过 25 个字符的单词(aagh,所以没有什么可做的),您可以强制“PHP wordwrap”剪切单词。(改进)

3 - 如果你的字符串短于 25 个字符,那么 "..." 在一个完整的句子之后会显得很难看。(改进)

$str = "This string might be longer than 25 chars, or might not!";
// we are forcing to cut long words...
$wrapped = wordwrap($str, 25, "\n", 1);
var_dump($wrapped);

$lines = explode("\n", $wrapped);
var_dump($lines);

// if our $str is shorter than 25, there will be no $lines[1]
(array_key_exists('1', $lines)) ? $suffix = '...' : $suffix = '';
$new_str = $lines[0] . $suffix;
var_dump($new_str);
于 2012-02-13T22:18:49.657 回答
1

substr函数最适合您

于 2009-08-06T20:30:48.400 回答
1

您正在寻找substr方法。

$s = substr($input, 0, 25);

这将使您获得第一个字符串,然后您可以将任何您想要的内容附加到末尾。

于 2009-08-06T20:31:33.157 回答
0
<?php echo substr('12345678901234567890abcdefg', 0, 20) . '...' ?>

http://fr.php.net/manual/en/function.substr.php

于 2009-08-06T20:31:22.610 回答
0
 echo substr($str,0,25)."...";

会做的伎俩,但如果你正在处理单词,你可能想要切断单词边界,这样你就不会有部分单词 doig this:The quick bl ...

所以要做到这一点(粗鲁的我的头顶):

$words = split(" ", strlen($str));

for($i = 0,$j=0; $i< 25 && $j < sizeof($words) ;$j++)
{
    $i += strlen($words[$j]);
    echo $words[$j]. " ";    
}
echo "...";
于 2009-08-06T20:32:17.787 回答