function limit_words($words, $limit, $append = ' …') {
// Add 1 to the specified limit becuase arrays start at 0
$limit = $limit+1;
// Store each individual word as an array element
// Up to the limit
$words = explode(' ', $words, $limit);
// Shorten the array by 1 because that final element will be the sum of all the words after the limit
array_pop($words);
// Implode the array for output, and append an ellipse
$words = implode(' ', $words) . $append;
// Return the result
return $words;
}
Psst! Create a DigitalOcean account and get $200 in free credit for cloud-based hosting and services.
Instead only words, this works for sentences.
So no half sentences anymore:
<?php
function substr_sentence($string, $start=0, $limit=10, $max_char = 300)
{
/* This functions cuts a long string in sentences.
*
* substr_sentence($string, $start, $limit);
* $string = 'A example. By someone that loves PHP. Do you? We do!';
* $start = 0; // we would start at the beginning
* $limit = 10; // so, we get 10 sentences (not 10 words or characters!)
*
* It's not as substr()) in single characters.
* It's not as substr_words() in single words.
*
* No more broken lines in a story. The story/article must go on!
*
* Written by Eddy Erkelens "Zunflappie"
* Published on www.mastercode.nl
* May be free used and adapted
*
*/
// list of sentences-ends. All sentences ends with one of these. For PHP, add the ;
$end_characters = array(
'.',
'?',
'!'
);
// put $string in array $parts, necessary evil
$parts = array($string);
// foreach interpunctation-mark we will do this loop
foreach($end_characters as $end_character)
{
// go thru each part of the sentences we already have
foreach($parts as $part)
{
// make array with the new sentences
$sentences[] = explode($end_character, $part);
}
// unfortunately explode() removes the end character itself. So, place it back
foreach($sentences as $sentence)
{
// some strange stuff
foreach($sentence as $real_sentence)
{
// empty sentence we do not want
if($real_sentence != '')
{
// if there is already an end-character, dont place another one
if(in_array(substr($real_sentence, -1, 1), $end_characters))
{
// store for next round
$next[] = trim($real_sentence);
}
else
{
// store for next round
$next[] = trim($real_sentence).$end_character;
}
}
}
}
// store for next round
$parts = $next;
// unset the remaining and useless stuff
unset($sentences, $sentence, $next);
}
// check for max-char-length
$total_chars = 0;
$sentence_nr = 0;
$sentences = array();
// walk thru each member of $part
foreach($parts as $part)
{
// count the string-lenght and add this to $total_chars
$total_chars += strlen($part);
// if $total-chars is higher then max-char, dont add this sentences!
if($total_chars
Here is it:
A little bit late, but i did need the function again, for myself
…
<?php
function substr_sentence($string, $start=0, $limit=10, $max_char = 600)
{
/* This functions cuts a long string in sentences.
*
* substr_sentence($string, $start, $limit);
* $string = 'A example. By someone that loves PHP. Do you? We do!';
* $start = 0; // we would start at the beginning
* $limit = 10; // so, we get 10 sentences (not 10 words or characters!)
*
* It's not as substr()) in single characters.
* It's not as substr_words() in single words.
*
* No more broken lines in a story. The story/article must go on!
*
* Written by Eddy Erkelens "Zunflappie"
* Published on http://www.mastercode.nl
* May be free used and adapted
*
*/
// list of sentences-ends. All sentences ends with one of these. For PHP, add the ;
$end_characters = array(
'. ',
'? ',
'! '
);
// put $string in array $parts, necessary evil
$parts = array($string);
// foreach interpunctation-mark we will do this loop
foreach($end_characters as $end_character)
{
// go thru each part of the sentences we already have
foreach($parts as $part)
{
// make array with the new sentences
$sentences[] = explode($end_character, $part);
}
// unfortunately explode() removes the end character itself. So, place it back
foreach($sentences as $sentence)
{
// some strange stuff
foreach($sentence as $real_sentence)
{
// empty sentence we do not want
if($real_sentence != '')
{
// if there is already an end-character, dont place another one
if(in_array(substr($real_sentence, -1, 1), $end_characters))
{
// store for next round
$next[] = trim($real_sentence);
}
else
{
// store for next round and add the removed character
$next[] = trim($real_sentence).$end_character;
}
}
}
}
// store for next round
$parts = $next;
// unset the remaining and useless stuff
unset($sentences, $sentence, $next);
}
// check for max-char-length
$total_chars = 0;
$sentence_nr = 0;
$sentences = array();
// walk thru each member of $part
foreach($parts as $part)
{
// count the string-lenght and add this to $total_chars
$total_chars += strlen($part);
// if $total-chars not already higher then max-char, add this sentences!
if($total_chars
I have noticed a bug in this function. When my string is returned, each sentence ends in “.!?”, as the foreach ($end_characters) loop always tests $real_sentence for the presence of an end character, and when it adds the end character, that string is not updated, only the stored string is. So each time it loops through end_characters, the string does not contain a character, so one is added.
Matt – I had the same issue, the function was leaving ‘.!?’ after each sentence. The reason is there are unnecessary spaces added in the $end_characters array. Line #24 from Eddy’s codepad: http://codepad.org/AqIL9V4N should be changed to (notice no spaces in each variable):
Which is better on a high traffic site?
Instead only words, this works for sentences.
So no half sentences anymore:
@ Eddy Erkelens. Your solution is really interesting. Could you post the full code of the function because it got cut on the part if($total_chars…
Here is it:
A little bit late, but i did need the function again, for myself
…
<?php
function substr_sentence($string, $start=0, $limit=10, $max_char = 600)
{
/* This functions cuts a long string in sentences.
*
* substr_sentence($string, $start, $limit);
* $string = 'A example. By someone that loves PHP. Do you? We do!';
* $start = 0; // we would start at the beginning
* $limit = 10; // so, we get 10 sentences (not 10 words or characters!)
*
* It's not as substr()) in single characters.
* It's not as substr_words() in single words.
*
* No more broken lines in a story. The story/article must go on!
*
* Written by Eddy Erkelens "Zunflappie"
* Published on http://www.mastercode.nl
* May be free used and adapted
*
*/
…
And the last part… apart.
…
// walk thru each member of $part
foreach($parts as $part)
{
// count the string-lenght and add this to $total_chars
$total_chars += strlen($part);
…
Bloody bug…
It get cuts of on a ARROW_LEFT..
So: codepad to the rescue. Sorry Chris.
Link: http://codepad.org/AqIL9V4N
And a substr_words() : http://codepad.org/jCLTm1zJ
And a sencents-counter: http://codepad.org/o9I3zdI9
All together, you can count sentences of a long text.
Then cut it in half (use ceil() or abs()).
Slice it with substr_sentences() and there you go.
Hi,
I want to cut the sentence to 200 character after that read more link.
Can you help me out.
I have noticed a bug in this function. When my string is returned, each sentence ends in “.!?”, as the foreach ($end_characters) loop always tests $real_sentence for the presence of an end character, and when it adds the end character, that string is not updated, only the stored string is. So each time it loops through end_characters, the string does not contain a character, so one is added.
Matt – I had the same issue, the function was leaving ‘.!?’ after each sentence. The reason is there are unnecessary spaces added in the $end_characters array. Line #24 from Eddy’s codepad: http://codepad.org/AqIL9V4N should be changed to (notice no spaces in each variable):
I hope that helps someone!
KB