How to Truncate a string in PHP to the word closest to a certain number of characters?

前端 未结 27 1121
猫巷女王i
猫巷女王i 2020-11-22 07:28

I have a code snippet written in PHP that pulls a block of text from a database and sends it out to a widget on a webpage. The original block of text can be a lengthy artic

相关标签:
27条回答
  • 2020-11-22 07:53

    This will return the first 200 characters of words:

    preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, 201));
    
    0 讨论(0)
  • 2020-11-22 07:55
    /*
    Cut the string without breaking any words, UTF-8 aware 
    * param string $str The text string to split
    * param integer $start The start position, defaults to 0
    * param integer $words The number of words to extract, defaults to 15
    */
    function wordCutString($str, $start = 0, $words = 15 ) {
        $arr = preg_split("/[\s]+/",  $str, $words+1);
        $arr = array_slice($arr, $start, $words);
        return join(' ', $arr);
    }
    

    Usage:

    $input = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna liqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.';
    echo wordCutString($input, 0, 10); 
    

    This will output first 10 words.

    The preg_split function is used to split a string into substrings. The boundaries along which the string is to be split, are specified using a regular expressions pattern.

    preg_split function takes 4 parameters, but only the first 3 are relevant to us right now.

    First Parameter – Pattern The first parameter is the regular expressions pattern along which the string is to be split. In our case, we want to split the string across word boundaries. Therefore we use a predefined character class \s which matches white space characters such as space, tab, carriage return and line feed.

    Second Parameter – Input String The second parameter is the long text string which we want to split.

    Third Parameter – Limit The third parameter specifies the number of substrings which should be returned. If you set the limit to n, preg_split will return an array of n elements. The first n-1 elements will contain the substrings. The last (n th) element will contain the rest of the string.

    0 讨论(0)
  • 2020-11-22 07:56

    Ok so I got another version of this based on the above answers but taking more things in account(utf-8, \n and &nbsp ; ), also a line stripping the wordpress shortcodes commented if used with wp.

    function neatest_trim($content, $chars) 
      if (strlen($content) > $chars) 
      {
        $content = str_replace(' ', ' ', $content);
        $content = str_replace("\n", '', $content);
        // use with wordpress    
        //$content = strip_tags(strip_shortcodes(trim($content)));
        $content = strip_tags(trim($content));
        $content = preg_replace('/\s+?(\S+)?$/', '', mb_substr($content, 0, $chars));
    
        $content = trim($content) . '...';
        return $content;
      }
    
    0 讨论(0)
  • 2020-11-22 07:56

    This is how i did it:

    $string = "I appreciate your service & idea to provide the branded toys at a fair rent price. This is really a wonderful to watch the kid not just playing with variety of toys but learning faster compare to the other kids who are not using the BooksandBeyond service. We wish you all the best";
    
    print_r(substr($string, 0, strpos(wordwrap($string, 250), "\n")));
    
    0 讨论(0)
  • 2020-11-22 07:57

    Use strpos and substr:

    <?php
    
    $longString = "I have a code snippet written in PHP that pulls a block of text.";
    $truncated = substr($longString,0,strpos($longString,' ',30));
    
    echo $truncated;
    

    This will give you a string truncated at the first space after 30 characters.

    0 讨论(0)
  • 2020-11-22 07:57

    It's surprising how tricky it is to find the perfect solution to this problem. I haven't yet found an answer on this page that doesn't fail in at least some situations (especially if the string contains newlines or tabs, or if the word break is anything other than a space, or if the string has UTF-8 multibyte characters).

    Here is a simple solution that works in all cases. There were similar answers here, but the "s" modifier is important if you want it to work with multi-line input, and the "u" modifier makes it correctly evaluate UTF-8 multibyte characters.

    function wholeWordTruncate($s, $characterCount) 
    {
        if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) return $match[0];
        return $s;
    }
    

    One possible edge case with this... if the string doesn't have any whitespace at all in the first $characterCount characters, it will return the entire string. If you prefer it forces a break at $characterCount even if it isn't a word boundary, you can use this:

    function wholeWordTruncate($s, $characterCount) 
    {
        if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) return $match[0];
        return mb_substr($return, 0, $characterCount);
    }
    

    One last option, if you want to have it add ellipsis if it truncates the string...

    function wholeWordTruncate($s, $characterCount, $addEllipsis = ' …') 
    {
        $return = $s;
        if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) 
            $return = $match[0];
        else
            $return = mb_substr($return, 0, $characterCount);
        if (strlen($s) > strlen($return)) $return .= $addEllipsis;
        return $return;
    }
    
    0 讨论(0)
提交回复
热议问题