将文本修剪为 340 个字符

发布于 2024-08-18 17:49:47 字数 170 浏览 5 评论 0原文

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

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

E.g.

NOT: In the begin....

BUT: In the ...

I'm pulling blog posts from a DB. I want to trim the text to a max length of 340 characters.

If the blog post is over 340 characters I want to trim the text to the last full word and add '...' on the end.

E.g.

NOT: In the begin....

BUT: In the ...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

娇女薄笑 2024-08-25 17:49:47

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

$string = substr($string, 0, 340);
$string = substr($string, 0, strrpos($string, ' ')) . " ...";

It seems like you would want to first trim the text down to 340 characters exactly, then find the location of the last ' ' in the string and trim down to that amount. Like this:

$string = substr($string, 0, 340);
$string = substr($string, 0, strrpos($string, ' ')) . " ...";
愛放△進行李 2024-08-25 17:49:47

其他答案向您展示了如何使文本大约 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

The other answers show you how you can make the text roughly 340 characters. If that's fine for you, then use one of the other answers.

But if you want a very strict maximum of 340 characters, the other answers won't work. You need to remember that adding the '...' can increase the length of the string and you need to take account of that.

$max_length = 340;

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

Note also that here I'm using the overload of strrpos that takes an offset to start searching directly from the correct location in the string, rather than first shortening the string.

See it working online: ideone

心如狂蝶 2024-08-25 17:49:47

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

echo mb_strimwidth($string, 0, 340, '...');

If you have the mbstring extension enabled (which is on most servers nowadays), you can use the mb_strimwidth function.

echo mb_strimwidth($string, 0, 340, '...');
豆芽 2024-08-25 17:49:47

尝试:

preg_match('/^.{0,340}(?:.*?)\b/siu', $text, $matches);
echo $matches[0] . '...';

try:

preg_match('/^.{0,340}(?:.*?)\b/siu', $text, $matches);
echo $matches[0] . '...';
醉梦枕江山 2024-08-25 17:49:47

我把 John Conde 的答案放在一个方法中:

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... */

I put the answer of John Conde in a method:

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

Examples:

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... */
半岛未凉 2024-08-25 17:49:47

您可以尝试使用PHP自带的函数,例如wordwrap

print wordwrap($text,340) . "...";

you can try using functions that comes with PHP , such as wordwrap

print wordwrap($text,340) . "...";
随心而道 2024-08-25 17:49:47

functiontrim_characters( $text, $length = 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() 将字符串修剪为指定数量的字符,并在空格处优雅地停止。
我认为这对你有帮助。

function trim_characters( $text, $length = 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;

}

Use this function trim_characters() to trims a string of words to a specified number of characters, gracefully stopping at white spaces.
I think this is helpful to you.

输什么也不输骨气 2024-08-25 17:49:47

为什么这样?

  • 我喜欢使用正则表达式解决方案而不是子字符串,以捕获除空格断词(标点符号等)以外的任何其他问题。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. 尽管事实上有问题的结果 在 ...< /code> 描述的如我所愿,我感觉 In the... 比较流畅(也不喜欢 In the,... 等)

Why this way?

  • I like the regex solution over substring, to catch any other than whitespace word breaks (interpunction etc.)
  • John Condoe's solution is not perfectly correct, since it trim text to 340 characters and then finish the last word (so will often be longer than desired)

Actual regex solution is very simple:

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

Full method in PHP could look like this:

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

More explanation:

  • $shownLength is to keep very strict limit (like Mark Byers mentioned)
  • Exception is thrown in case given length was too small
  • \w\b part is to avoid whitespace or interpunction at the end (see 1 below)
  • In case first word would be longer than desired max length, that word will be brutally cut

  1. Despite the fact that in question result In the ... is described as desired, I feel In the... is more smooth (also don't like In the,... etc.)
温暖的光 2024-08-25 17:49:47

最简单解决方案

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

Simplest solution

$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).'....';

For multi-byte text

$stringText= "UTIL CONTROL DISTRIBUCION AMARRE CIGÜEÑAL";
$string_encoding = 'utf8';
$s_trunc =  mb_substr($stringText, 0, 37, $string_encoding);
echo $s_trunc;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文