English 中文(简体)
Trim text to 340 chars [duplicate]
原标题:
  • 时间:2010-01-20 20:21:46
  •  标签:
  • php
  • ellipsis

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 ...
最佳回答

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

问题回答

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,    )) . " ...";

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,  ... );

try:

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

I put the answer of John Conde in a method:

function softTrim($text, $count, $wrapText= ... ){

    if(strlen($text)>$count){
        preg_match( /^.{0,  . $count .  }(?:.*?)/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... */

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

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

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.

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

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;




相关问题
Brute-force/DoS prevention in PHP [closed]

I am trying to write a script to prevent brute-force login attempts in a website I m building. The logic goes something like this: User sends login information. Check if username and password is ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

定值美元

如何确认来自正确来源的数字。

Generating a drop down list of timezones with PHP

Most sites need some way to show the dates on the site in the users preferred timezone. Below are two lists that I found and then one method using the built in PHP DateTime class in PHP 5. I need ...

Text as watermarking in PHP

I want to create text as a watermark for an image. the water mark should have the following properties front: Impact color: white opacity: 31% Font style: regular, bold Bevel and Emboss size: 30 ...

How does php cast boolean variables?

How does php cast boolean variables? I was trying to save a boolean value to an array: $result["Users"]["is_login"] = true; but when I use debug the is_login value is blank. and when I do ...

热门标签