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

[韓日関係] 首相含む大幅な内閣改造の可能性…早ければ来月10日ごろ=韓国

div not scrolling properly with slimScroll plugin

I am using the slimScroll plugin for jQuery by Piotr Rochala Which is a great plugin for nice scrollbars on most browsers but I am stuck because I am using it for a chat box and whenever the user appends new text to the boxit does scroll using the .scrollTop() method however the plugin's scrollbar doesnt scroll with it and when the user wants to look though the chat history it will start scrolling from near the top. I have made a quick demo of my situation http://jsfiddle.net/DY9CT/2/ Does anyone know how to solve this problem?

Why does this javascript based printing cause Safari to refresh the page?

The page I am working on has a javascript function executed to print parts of the page. For some reason, printing in Safari, causes the window to somehow update. I say somehow, because it does not really refresh as in reload the page, but rather it starts the "rendering" of the page from start, i.e. scroll to top, flash animations start from 0, and so forth. The effect is reproduced by this fiddle: http://jsfiddle.net/fYmnB/ Clicking the print button and finishing or cancelling a print in Safari causes the screen to "go white" for a sec, which in my real website manifests itself as something "like" a reload. While running print button with, let's say, Firefox, just opens and closes the print dialogue without affecting the fiddle page in any way. Is there something with my way of calling the browsers print method that causes this, or how can it be explained - and preferably, avoided? P.S.: On my real site the same occurs with Chrome. In the ex