15

我正在从数据库中提取博客文章。我想将文本修剪为最大长度 340 个字符。

如果博客文章超过 340 个字符,我想将文本修剪到最后一个完整的单词并在末尾添加“...”。

E.g.

NOT: In the begin....

BUT: In the ...
4

9 回答 9

27

似乎您希望首先将文本精确地修剪到 340 个字符,然后找到字符串中最后一个 ' ' 的位置并修剪到该数量。像这样:

$string = substr($string, 0, 340);
$string = substr($string, 0, strrpos($string, ' ')) . " ...";
于 2010-01-20T20:26:58.847 回答
18

其他答案向您展示了如何使文本大约340 个字符。如果这对您没问题,请使用其他答案之一。

但是,如果您想要非常严格的最多 340 个字符,则其他答案将不起作用。您需要记住,添加'...'可以增加字符串的长度,您需要考虑到这一点。

$max_length = 340;

if (strlen($s) > $max_length)
{
    $offset = ($max_length - 3) - strlen($s);
    $s = substr($s, 0, strrpos($s, ' ', $offset)) . '...';
}

另请注意,这里我使用的重载strrpos需要一个偏移量来直接从字符串中的正确位置开始搜索,而不是首先缩短字符串。

在线查看它:ideone

于 2010-01-20T20:30:04.030 回答
17

如果你启用了 mbstring 扩展(现在大多数服务器上都有),你可以使用 mb_strimwidth 函数。

echo mb_strimwidth($string, 0, 340, '...');
于 2014-06-07T05:31:16.170 回答
7

尝试:

preg_match('/^.{0,340}(?:.*?)\b/siu', $text, $matches);
echo $matches[0] . '...';
于 2010-01-20T20:26:02.417 回答
2

我把约翰康德的答案放在一个方法中:

function softTrim($text, $count, $wrapText='...'){

    if(strlen($text)>$count){
        preg_match('/^.{0,' . $count . '}(?:.*?)\b/siu', $text, $matches);
        $text = $matches[0];
    }else{
        $wrapText = '';
    }
    return $text . $wrapText;
}

例子:

echo softTrim("Lorem Ipsum is simply dummy text", 10);
/* Output: Lorem Ipsum... */

echo softTrim("Lorem Ipsum is simply dummy text", 33);
/* Output: Lorem Ipsum is simply dummy text */

echo softTrim("LoremIpsumissimplydummytext", 10);
/* Output: LoremIpsumissimplydummytext... */
于 2013-02-15T14:22:01.787 回答
0

你可以尝试使用 PHP 自带的函数,比如 wordwrap

print wordwrap($text,340) . "...";
于 2010-01-21T01:22:11.130 回答
0

功能修剪字符($文本,$长度= 340){

$length = (int) $length;
$text = trim( strip_tags( $text ) );

if ( strlen( $text ) > $length ) {
    $text = substr( $text, 0, $length + 1 );
    $words = preg_split( "/[\s]| /", $text, -1, PREG_SPLIT_NO_EMPTY );
    preg_match( "/[\s]| /", $text, $lastchar, 0, $length );
    if ( empty( $lastchar ) )
        array_pop( $words );

    $text = implode( ' ', $words ); 
}

return $text;

}

使用此函数 trim_characters() 将字符串修剪为指定数量的字符,优雅地停在空格处。我认为这对你有帮助。

于 2012-11-01T11:47:28.683 回答
0

为什么这样?

  • 我喜欢substring上的正则表达式解决方案,以捕获除空格以外的任何断字(插播等)
  • John Condoe 的解决方案并不完全正确,因为它将文本修剪为 340 个字符,然后完成最后一个单词(因此通常会比预期的要长)

实际的正则表达式解决方案非常简单:

/^(.{0,339}\w\b)/su

PHP 中的完整方法可能如下所示:

function trim_length($text, $maxLength, $trimIndicator = '...')
{
        if(strlen($text) > $maxLength) {

            $shownLength = $maxLength - strlen($trimIndicator);

            if ($shownLength < 1) {

                throw new \InvalidArgumentException('Second argument for ' . __METHOD__ . '() is too small.');
            }

            preg_match('/^(.{0,' . ($shownLength - 1) . '}\w\b)/su', $text, $matches);                               

            return (isset($matches[1]) ? $matches[1] : substr($text, 0, $shownLength)) . $trimIndicator ;
        }

        return $text;
}

更多解释:

  • $shownLength是保持非常严格的限制(就像 Mark Byers 提到的)
  • 如果给定长度太小,则会引发异常
  • \w\b部分是为了避免结尾处的空格或插入(见下面的1)
  • 如果第一个单词比期望的最大长度长,该单词将被粗暴地剪掉

  1. 尽管有问题的结果In the ...被描述为所需的事实,但我觉得In the...更顺利(也不喜欢In the,...等)
于 2016-02-05T14:02:48.610 回答
0

最简单的解决方案

$text_to_be_trim= "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry standard.";
if(strlen($text_to_be_trim) > 20)   
    $text_to_be_trim= substr($text_to_be_trim,0,20).'....';

对于多字节文本

$stringText= "UTIL CONTROL DISTRIBUCION AMARRE CIGÜEÑAL";
$string_encoding = 'utf8';
$s_trunc =  mb_substr($stringText, 0, 37, $string_encoding);
echo $s_trunc;
于 2017-05-23T11:38:25.407 回答