Truncate a string to first n characters of a string and add three dots if any characters are removed

PhpStringEllipsisTruncation

Php Problem Overview


How can I get the first n characters of a string in PHP? What's the fastest way to trim a string to a specific number of characters, and append '...' if needed?

Php Solutions


Solution 1 - Php

//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';

Update:

Based on suggestion for checking length (and also ensuring similar lengths on trimmed and untrimmed strings):

$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;

So you will get a string of max 13 characters; either 13 (or less) normal characters or 10 characters followed by '...'

Update 2:

Or as function:

function truncate($string, $length, $dots = "...") {
    return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}

Update 3:

It's been a while since I wrote this answer and I don't actually use this code any more. I prefer this function which prevents breaking the string in the middle of a word using the wordwrap function:

function truncate($string,$length=100,$append="…") {
  $string = trim($string);

  if(strlen($string) > $length) {
    $string = wordwrap($string, $length);
    $string = explode("\n", $string, 2);
    $string = $string[0] . $append;
  }

  return $string;
}

Solution 2 - Php

This functionality has been built into PHP since version 4.0.6. See the docs.

echo mb_strimwidth('Hello World', 0, 10, '...');

// outputs Hello W...

Note that the trimmarker (the ellipsis above) are included in the truncated length.

Solution 3 - Php

The Multibyte extension can come in handy if you need control over the string charset.

$charset = 'UTF-8';
$length = 10;
$string = 'Hai to yoo! I like yoo soo!';
if(mb_strlen($string, $charset) > $length) {
  $string = mb_substr($string, 0, $length - 3, $charset) . '...';
}

Solution 4 - Php

sometimes, you need to limit the string to the last complete word ie: you don't want the last word to be broken instead you stop with the second last word.

eg: we need to limit "This is my String" to 6 chars but instead of 'This i..." we want it to be 'This..." ie we will skip that broken letters in the last word.

phew, am bad at explaining, here is the code.

class Fun {

    public function limit_text($text, $len) {
        if (strlen($text) < $len) {
            return $text;
        }
        $text_words = explode(' ', $text);
        $out = null;


        foreach ($text_words as $word) {
            if ((strlen($word) > $len) && $out == null) {

                return substr($word, 0, $len) . "...";
            }
            if ((strlen($out) + strlen($word)) > $len) {
                return $out . "...";
            }
            $out.=" " . $word;
        }
        return $out;
    }

}

Solution 5 - Php

If you want to cut being careful to don't split words you can do the following

function ellipse($str,$n_chars,$crop_str=' [...]')
{
	$buff=strip_tags($str);
	if(strlen($buff) > $n_chars)
	{
	    $cut_index=strpos($buff,' ',$n_chars);
	    $buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
    }
    return $buff;
}

if $str is shorter than $n_chars returns it untouched.

If $str is equal to $n_chars returns it as is as well.

if $str is longer than $n_chars then it looks for the next space to cut or (if no more spaces till the end) $str gets cut rudely instead at $n_chars.

NOTE: be aware that this method will remove all tags in case of HTML.

Solution 6 - Php

The codeigniter framework contains a helper for this, called the "text helper". Here's some documentation from codeigniter's user guide that applies: http://codeigniter.com/user_guide/helpers/text_helper.html (just read the word_limiter and character_limiter sections). Here's two functions from it relevant to your question:

if ( ! function_exists('word_limiter'))
{
	function word_limiter($str, $limit = 100, $end_char = '&#8230;')
	{
		if (trim($str) == '')
		{
			return $str;
		}
	
		preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);
			
		if (strlen($str) == strlen($matches[0]))
		{
			$end_char = '';
		}
		
		return rtrim($matches[0]).$end_char;
	}
}

And

if ( ! function_exists('character_limiter'))
{
	function character_limiter($str, $n = 500, $end_char = '&#8230;')
	{
		if (strlen($str) < $n)
		{
			return $str;
		}
		
		$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));

		if (strlen($str) <= $n)
		{
			return $str;
		}

		$out = "";
		foreach (explode(' ', trim($str)) as $val)
		{
			$out .= $val.' ';
			
			if (strlen($out) >= $n)
			{
				$out = trim($out);
				return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
			}		
		}
	}
}

Solution 7 - Php

if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";

Solution 8 - Php

Use substring

http://php.net/manual/en/function.substr.php

$foo = substr("abcde",0, 3) . "...";

Solution 9 - Php

It's best to abstract you're code like so (notice the limit is optional and defaults to 10):

print limit($string);


function limit($var, $limit=10)
{
    if ( strlen($var) > $limit )
    {
        return substr($string, 0, $limit) . '...';
    }
    else
    {
        return $var;
    }
}

Solution 10 - Php

The function I used:

function cutAfter($string, $len = 30, $append = '...') {
        return (strlen($string) > $len) ? 
          substr($string, 0, $len - strlen($append)) . $append : 
          $string;
}

See it in action.

Solution 11 - Php

I developed a function for this use

 function str_short($string,$limit)
    	{
    		$len=strlen($string);
    		if($len>$limit)
    		{
    		 $to_sub=$len-$limit;
    		 $crop_temp=substr($string,0,-$to_sub);
    		 return $crop_len=$crop_temp."...";
    		}
    		else
    		{
    			return $string;
    		}
        }

you just call the function with string and limite
eg:str_short("hahahahahah",5);
it will cut of your string and add "..." at the end
:)

Solution 12 - Php

This is what i do

	function cutat($num, $tt){
		if (mb_strlen($tt)>$num){
			$tt=mb_substr($tt,0,$num-2).'...';
		}
		return $tt;
	}

where $num stands for number of chars, and $tt the string for manipulation.

Solution 13 - Php

To create within a function (for repeat usage) and dynamical limited length, use:

function string_length_cutoff($string, $limit, $subtext = '...')
{
    return (strlen($string) > $limit) ? substr($string, 0, ($limit-strlen(subtext))).$subtext : $string;
}

// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26);

// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26, '..');

Solution 14 - Php

I'm not sure if this is the fastest solution, but it looks like it is the shortest one:

$result = current(explode("\n", wordwrap($str, $width, "...\n")));

P.S. See some examples here https://stackoverflow.com/a/17852480/131337

Solution 15 - Php

This function do the job without breaking words in the middle

	function str_trim($str,$char_no){
		if(strlen($str)<=$char_no)
			return $str;
		else{
			$all_words=explode(" ",$str);
			$out_str='';
			foreach ($all_words as $word) {
				$temp_str=($out_str=='')?$word:$out_str.' '.$word;
				if(strlen($temp_str)>$char_no-3)//-3 for 3 dots
					return $out_str."...";
				$out_str=$temp_str;
			}
		}
    }

Solution 16 - Php

substr() would be best, you'll also want to check the length of the string first

$str = 'someLongString';
$max = 7;

if(strlen($str) > $max) {
   $str = substr($str, 0, $max) . '...';
}

wordwrap won't trim the string down, just split it up...

Solution 17 - Php

$width = 10;

$a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a);

or with wordwrap

$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);

Solution 18 - Php

this solution will not cut words, it will add three dots after the first space. I edited @Raccoon29 solution and I replaced all functions with mb_ functions so that this will work for all languages such as arabic

function cut_string($str, $n_chars, $crop_str = '...') {
    $buff = strip_tags($str);
    if (mb_strlen($buff) > $n_chars) {
        $cut_index = mb_strpos($buff, ' ', $n_chars);
        $buff = mb_substr($buff, 0, ($cut_index === false ? $n_chars : $cut_index + 1), "UTF-8") . $crop_str;
    }
    return $buff;
}

Solution 19 - Php

$yourString = "bla blaaa bla blllla bla bla";
$out = "";
if(strlen($yourString) > 22) {
    while(strlen($yourString) > 22) {
        $pos = strrpos($yourString, " ");
        if($pos !== false && $pos <= 22) {
            $out = substr($yourString,0,$pos);
            break;
        } else {
            $yourString = substr($yourString,0,$pos);
            continue;
        }
    }
} else {
    $out = $yourString;
}
echo "Output String: ".$out;

Solution 20 - Php

If there is no hard requirement on the length of the truncated string, one can use this to truncate and prevent cutting the last word as well:

$text = "Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";

// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/', ' ', $text);

// truncates the text
$text_truncated = mb_substr($text_only_spaces, 0, mb_strpos($text_only_spaces, " ", 50));

// prevents last word truncation
$preview = trim(mb_substr($text_truncated, 0, mb_strrpos($text_truncated, " ")));

In this case, $preview will be "Knowledge is a natural right of every human being".

Live code example: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlexView Question on Stackoverflow
Solution 1 - PhpBrendan BullenView Answer on Stackoverflow
Solution 2 - PhpbruchowskiView Answer on Stackoverflow
Solution 3 - PhpEmil VikströmView Answer on Stackoverflow
Solution 4 - PhpMortalViewsView Answer on Stackoverflow
Solution 5 - PhpTechNyquistView Answer on Stackoverflow
Solution 6 - PhpMatthewView Answer on Stackoverflow
Solution 7 - PhpHCLView Answer on Stackoverflow
Solution 8 - PhpDlongneckerView Answer on Stackoverflow
Solution 9 - PhpTravisOView Answer on Stackoverflow
Solution 10 - PhpBenjamin CrouzierView Answer on Stackoverflow
Solution 11 - PhpSaikeluView Answer on Stackoverflow
Solution 12 - PhpchristozView Answer on Stackoverflow
Solution 13 - PhptfontView Answer on Stackoverflow
Solution 14 - PhpSergiy SokolenkoView Answer on Stackoverflow
Solution 15 - PhpSamadhi Sri Udara WijenayakeView Answer on Stackoverflow
Solution 16 - PhptsgrasserView Answer on Stackoverflow
Solution 17 - PhpakondView Answer on Stackoverflow
Solution 18 - PhpWaqlehView Answer on Stackoverflow
Solution 19 - PhpJaykishanView Answer on Stackoverflow
Solution 20 - Phpjim_kastrinView Answer on Stackoverflow