Skip to main content

How can I truncate a string in PHP?



How can I truncate a string after 20 words in PHP?





Source: Tips4all

Comments

  1. function limit_text($text, $limit) {
    if (strlen($text) > $limit) {
    $words = str_word_count($text, 2);
    $pos = array_keys($words);
    $text = substr($text, 0, $pos[$limit]) . '...';
    }
    return $text;
    }

    echo limit_text('Hello here is a long sentence blah blah blah blah blah hahahaha haha haaaaaa', 5);


    Outputs:

    Hello here is a long ...

    ReplyDelete
  2. change the "2" to 19 to get first 20 words. This one gets the first 3 words:

    function first3words($s) {
    return preg_replace('/((\w+\W*){2}(\w+))(.*)/', '${1}', $s);
    }

    var_dump(first3words("hello yes, world wah ha ha")); # => "hello yes, world"
    var_dump(first3words("hello yes,world wah ha ha")); # => "hello yes,world"
    var_dump(first3words("hello yes world wah ha ha")); # => "hello yes world"
    var_dump(first3words("hello yes world")); # => "hello yes world"
    var_dump(first3words("hello yes world.")); # => "hello yes world"
    var_dump(first3words("hello yes")); # => "hello yes"
    var_dump(first3words("hello")); # => "hello"
    var_dump(first3words("a")); # => "a"
    var_dump(first3words("")); # => ""

    ReplyDelete
  3. This looks pretty good to me:


    A common problem when creating dynamic
    web pages (where content is sourced
    from a database, content management
    system or external source such as an
    RSS feed) is that the input text can
    be too long and cause the page layout
    to 'break'.

    One solution is to truncate the text
    so that it fits on the page. This
    sounds simple, but often the results
    aren't as expected due to words and
    sentences being cut off at
    inappropriate points.

    ReplyDelete
  4. Split the string (into an array) by <space>, and then take the first 20 elements of that array.

    ReplyDelete
  5. Try regex.

    You need something that would match 20 words (or 20 word boundaries).

    So (my regex is terrible so correct me if this isn't accurate):

    /(\w+\b){20}/


    And here are some examples of regex in php.

    ReplyDelete
  6. Something like this could probably do the trick:

    <?php
    $words = implode(' ', array_slice(split($input, ' ', 21), 0, 20));

    ReplyDelete
  7. use PHP tokenizer function strtok() in a loop.

    $token = strtok($string, " "); // we assume that words are separated by sapce or tab
    $i = 0;
    $first20Words = '';
    while ($token !== false && $i < 20) {
    $first20Words .= $token;
    $token = strtok(" ");
    $i++;
    }
    echo $first20Words;

    ReplyDelete
  8. use explode() .

    Example from the docs.

    // Example 1
    $pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
    $pieces = explode(" ", $pizza);
    echo $pieces[0]; // piece1
    echo $pieces[1]; // piece2


    note that explode has a limit function. So you could do something like

    $message = implode(" ", explode(" ", $long_message, 20));

    ReplyDelete
  9. based on 動靜能量's answer:

    function truncate_words($string,$words=20) {
    return preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '${1}', $string);
    }


    or

    function truncate_words_with_ellipsis($string,$words=20,$ellipsis=' ...') {
    $new = preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '${1}', $string);
    if($new != $string){
    return $new.$ellipsis;
    }else{
    return $string;
    }

    }

    ReplyDelete
  10. Truncates to nearest preceding space of target character.

    <?php

    $str = "this is a string that is just some text for you to test with";

    print(truncateString($str, 20, true) . "\n");
    print(truncateString($str, 22, true) . "\n");
    print(truncateString($str, 24, true) . "\n");
    print(truncateString($str, 26, true, " :)") . "\n");
    print(truncateString($str, 28, true, "--") . "\n");

    function truncateString($str, $chars, $to_space, $replacement="...") {
    if($chars > strlen($str)) return $str;

    $str = substr($str, 0, $chars);

    $space_pos = strrpos($str, " ");
    if($to_space && $space_pos >= 0) {
    $str = substr($str, 0, strrpos($str, " "));
    }

    return($str . $replacement);
    }

    ?>

    /* OUTPUT
    this is a string...
    this is a string that...
    this is a string that...
    this is a string that is :)
    this is a string that is--
    */


    You can see a demo here.

    ReplyDelete
  11. what about

    chunk_split($str,20);


    Entry in the PHP Manual

    ReplyDelete
  12. Here is what I have implemented.

    function summaryMode($text, $limit, $link) {
    if (str_word_count($text, 0) > $limit) {
    $numwords = str_word_count($text, 2);
    $pos = array_keys($numwords);
    $text = substr($text, 0, $pos[$limit]).'... <a href="'.$link.'">Read More</a>';
    }
    return $text;
    }


    As you can see it is based off karim79's answer, all that needed changing was that the if statement also needed to check against words not characters.

    I also added a link to main function for convenience. So far it hsa worked flawlessly. Thanks to the original solution provider.

    ReplyDelete
  13. Here's one I use:

    $truncate = function( $str, $length ) {
    if( strlen( $str ) > $length && false !== strpos( $str, ' ' ) ) {
    $str = preg_split( '/ [^ ]*$/', substr( $str, 0, $length ));
    return htmlspecialchars($str[0]) . '&hellip;';
    } else {
    return htmlspecialchars($str);
    }
    };
    return $truncate( $myStr, 50 );

    ReplyDelete
  14. Its not my own creation, its a modification of previous posts. credits goes to karim79...!!! thanks yaar...

    function limit_text($text, $limit) {
    $strings = $text;
    if (strlen($text) > $limit) {
    $words = str_word_count($text, 2);
    $pos = array_keys($words);
    if(sizeof($pos) >$limit)
    {
    $text = substr($text, 0, $pos[$limit]) . '...';
    }
    return $text;
    }
    return $text;
    }

    ReplyDelete

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...

Is it possible to have IF statement in an Echo statement in PHP

Thanks in advance. I did look at the other questions/answers that were similar and didn't find exactly what I was looking for. I'm trying to do this, am I on the right path? echo " <div id='tabs-".$match."'> <textarea id='".$match."' name='".$match."'>". if ($COLUMN_NAME === $match) { echo $FIELD_WITH_COLUMN_NAME; } else { } ."</textarea> <script type='text/javascript'> CKEDITOR.replace( '".$match."' ); </script> </div>"; I am getting the following error message in the browser: Parse error: syntax error, unexpected T_IF Please let me know if this is the right way to go about nesting an IF statement inside an echo. Thank you.