Link to home
Start Free TrialLog in
Avatar of td234
td234

asked on

Truncate text by words

I posted this question and got an acceptable answer. I then noticed that the solution produced no results when the sample contained few words than the amount sought in the truncation.

I am trying to truncate a text field by a certain number of words. The truncation needs to be word boundries. Here is the solution I got:

$pat = '~^(\S+\s+(?=\S)){4}~' ;
$sub = "hello, foo-bar!\nbaz quux whatever" ;
preg_match($pat, $sub, $match = array());
echo "'", trim(array_shift($match)), "'\n";

If the sample has more words than the number in the pattern (4 in this case) then this works beautifully. If the sample is shorter, it return nothing and I would like for it to return the original sample. I hope this makes sense.

Thanks for all your help.

Avatar of ykf2000
ykf2000

try this


$pat = '~^(\S+\s+(?=\S)){4}~' ;
$sub = "hello, foo-bar!\nbaz quux whatever" ;
if(strlen($sub) > 4)
{
  preg_match($pat, $sub, $match = array());
  $result =  "'", trim(array_shift($match)), "'\n";
}
else
{
  $result = $sub;
}

echo $result;
Avatar of td234

ASKER

Thanks ykf2000, but your solutions counts the characters, not the words. Your statement would return true because of the first 4 characters in "hello" and I need to know if it has 4 words or less.
what about this:

$pat = '~^(\S+\s+(?=\S)){4}~' ;
$sub = "hello, foo-bar!\nbaz quux whatever" ;
preg_match($pat, $sub, $match = array());
if(strlen(trim(array_shift($match))) > 0)
{
 $result =  "'", trim(array_shift($match)), "'\n";
}
else
{
 $result = $sub;
}

echo $result;
Avatar of td234

ASKER

This did not work as is, but was close. AS written, this returned the X (4th) word when the IF statement was true. I had to repeat the preg_match before the first result.
Avatar of td234

ASKER

I am sure there is a cleaner way to do this than my modification to the above recomendation which has two regex's. Are there any regex experts out there with a solution?
ASKER CERTIFIED SOLUTION
Avatar of netapi
netapi

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of td234

ASKER

YES! That is the answer I was looking for. Thank you very much.