代码之家  ›  专栏  ›  技术社区  ›  CLiown

将文本剪裁为340个字符

  •  10
  • CLiown  · 技术社区  · 14 年前

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

    如果博客文章超过340个字符,我希望将文本裁剪为最后一个完整的单词,并在末尾添加“…”。

    E.g.
    
    NOT: In the begin....
    
    BUT: In the ...
    
    9 回复  |  直到 7 年前
        1
  •  13
  •   Mark Byers    12 年前

    其他答案向您展示了如何制作文本 粗略地 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

        2
  •  26
  •   Blank    14 年前

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

    $string = substr($string, 0, 340);
    $string = substr($string, 0, strrpos($string, ' ')) . " ...";
    
        3
  •  16
  •   onokazu    10 年前

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

    echo mb_strimwidth($string, 0, 340, '...');
    
        4
  •  7
  •   John Conde    14 年前

    尝试:

    preg_match('/^.{0,340}(?:.*?)\b/siu', $text, $matches);
    echo $matches[0] . '...';
    
        5
  •  2
  •   Sebastian Hojas    11 年前

    我用一种方法来回答约翰·康德:

    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... */
    
        6
  •  0
  •   ghostdog74    14 年前

    您可以尝试使用PHP附带的函数,如wordwarp

    print wordwrap($text,340) . "...";
    
        7
  •  0
  •   sjkon    12 年前

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

        8
  •  0
  •   D. Cichowski    8 年前

    为什么这样?

    • 我喜欢 正则表达式 解决方案 子串 ,捕获除空白分词之外的任何其他分词(函数间等)
    • 约翰·康迪的解决方案并不完全正确,因为它将文本剪裁为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,... 等)
        9
  •  0
  •   rahul sharma    7 年前

    最简单的解决方案

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