We help IT Professionals succeed at work.

using ellipses to truncate data in a cell

seanpowell
seanpowell asked
on
692 Views
Last Modified: 2012-05-05
I have a  td cell that shows data from a 1000 character input text box.
Can I display this:

<td>Display only the first 100 characters of a ....</td>

instead of

<td>Display all 1000 characters etc, etc.</td>

by automatically inserting an ellipses after a certain number of characters?

<table class="records">
<tr>
        <th>q1</th>
        <th>q2</th>
</tr>
<?
 
mysql_select_db($database_athconn, $athconn);
$query = "SELECT * FROM results";
$result = mysql_query($query, $athconn);
$num = mysql_numrows($result);
mysql_close();
$i=0;
while ($i < $num)
{
        $field1= mysql_result($result,$i,"q1");
        $field2= mysql_result($result,$i,"q2");
 
echo "<tr><td>$field1</td><td>$field2</td></tr>";
 
$i++;
}
 
?>
</table>

Open in new window

Comment
Watch Question

CERTIFIED EXPERT
Expert of the Year 2008
Top Expert 2008

Commented:

while ($i < $num)
{
        $field1= mysql_result($result,$i,"q1");
        $field2= mysql_result($result,$i,"q2");
 	$field1=preg_replace('\S+$','...',substr($field1,0,100));
 	$field2=preg_replace('\S+$','...',substr($field2,0,100));
echo "<tr><td>$field1</td><td>$field2</td></tr>";
 
$i++;
}

Open in new window

Most Valuable Expert 2011
Author of the Year 2014

Commented:
You can use substr - it is simpler code and might be a bit faster than REGEX (however I have not tested it for speed).

If you need a function to break on word boundaries, please post back here and I'll give you the one I use for "teasers" after the article headlines.

Best, ~Ray
while ($i < $num)
{
        $field1= substr(mysql_result($result,$i,"q1"),0,100) . '...';
        $field2= substr(mysql_result($result,$i,"q2"),0,100) . '...';
 
echo "<tr><td>$field1</td><td>$field2</td></tr>";
 
$i++;
}

Open in new window

Top Expert 2004

Author

Commented:
Well that's a tough call - I think both will likely work for me.
The only problem is that a blank record still returns the ellipses.

Thanks guys,
Sean
CERTIFIED EXPERT
Expert of the Year 2008
Top Expert 2008

Commented:
>>You can use substr
The "problem" with that is that the ellipsis are likely to start right in the middle of a word. My suggestion makes sure that the ellipsis starts right after a word.

>>The only problem is that a blank record still returns the ellipses.
try the attached code:
while ($i < $num)
{
        $field1= trim(mysql_result($result,$i,"q1"));
        $field2= trim(mysql_result($result,$i,"q2"));
	   if( strlen($field1) > 100 )
 		$field1=preg_replace('\S+$','...',substr($field1,0,100));
	   if( strlen($field2) > 100 )
 		$field2=preg_replace('\S+$','...',substr($field2,0,100));
echo "<tr><td>$field1</td><td>$field2</td></tr>";
 
$i++;
}

Open in new window

Top Expert 2004

Author

Commented:
Thanks hielo - I believe that is returning blank cells instead of any content.
CERTIFIED EXPERT
Expert of the Year 2008
Top Expert 2008
Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION
Most Valuable Expert 2011
Author of the Year 2014

Commented:
Here is the function that I use - sorry I could not get back to post sooner, but hope it's still helpful to you. ~Ray
/* ************************************************************************** */
// RETURN FIRST FEW WHOLE WORDS FOLLOWED BY ELLIPSES
// $length IS MINIMUM TRUNCATION CHARACTER COUNT
function teaser_fragment($text, $length=32) {
	if (strlen($text) < $length) {
return $text; }
 
	$x = 0;
	while ($x == 0) {
		if (substr($text,$length,1) == ' ') { $x = 1; } else { $length++; }
	}
	$text = substr($text,0,$length) . "...";
return $text;
}
/* ************************************************************************** */

Open in new window

Top Expert 2004

Author

Commented:
hielo - I'm sorry, that doesn't work as expected, it only adds ellipses if the count is reached in the middle of a word.

Ray - I guess I'm putting the 2 functions together incorrectly? I like the simplicity of the code...
function teaser_fragment($text, $length=32) {
        if (strlen($text) < $length) {
return $text; }
 
        $x = 0;
        while ($x == 0) {
                if (substr($text,$length,1) == ' ') { $x = 1; } else { $length++; }
        }
        $text = substr($text,0,$length) . "...";
return $text;
}
 
while ($i < $num)
{
        $field1= substr(mysql_result($result,$i,"q1"),0,100) . '...';
        $field2= substr(mysql_result($result,$i,"q2"),0,100) . '...';
 
echo "<tr><td>$field1</td><td>$field2</td></tr>";
 
$i++;
}

Open in new window

Most Valuable Expert 2011
Author of the Year 2014

Commented:
You might want to ACTUALLY CALL THE FUNCTION!  ;-)

Try this and see if it doesn't get you where you want to go.  You may have to tinker with the length parameter (presently default = 32 and your setting = 100).  You might decrease it to 96, etc. just to get the best looking output.

Best, ~Ray
function teaser_fragment($text, $length=32) {
        if (strlen($text) < $length) {
return $text; }
 
        $x = 0;
        while ($x == 0) {
                if (substr($text,$length,1) == ' ') { $x = 1; } else { $length++; }
        }
        $text = substr($text,0,$length) . "...";
return $text;
}
 
while ($i < $num)
{
        $field1= teaser_fragment(mysql_result($result,$i,"q1"),100);
        $field2= teaser_fragment(mysql_result($result,$i,"q2"),100);
 
echo "<tr><td>$field1</td><td>$field2</td></tr>";
 
$i++;
}

Open in new window

Top Expert 2004

Author

Commented:
Yes - that might help...

The db is timing out arounf row 9 - in your experience is there anything in that code that may cause that to happen?
Top Expert 2004

Author

Commented:
Displays correctly again once the code is removed.
<?php require_once('Connections/athconn.php'); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
 
<table class="records">
	<tr>
		<th>#</th>
		<th>q1</th>
		<th>q2</th>
		<th>q3</th>
	</tr>
 
<?
mysql_select_db($database_athconn, $athconn);
$query = "SELECT * FROM results";
$result = mysql_query($query, $athconn);
$num = mysql_numrows($result);
mysql_close();
$i=0;
function teaser_fragment($text, $length=32) {
        if (strlen($text) < $length) {
return $text; }
        $x = 0;
        while ($x == 0) {
                if (substr($text,$length,1) == ' ') { $x = 1; } else { $length++; }
        }
        $text = substr($text,0,$length) . "...";
return $text;
}
 
while ($i < $num) {
	$field1= mysql_result($result,$i,"q1");
	$field2= teaser_fragment(mysql_result($result,$i,"q2"),96);
	$field3= teaser_fragment(mysql_result($result,$i,"q3"),96);
	$i++;
	echo "<tr>";
	echo "<td>$i</td><td>$field1</td><td>$field2</td><td>$field3</td>";
	echo "</tr>";
}
?>
</table>
 
</body>
</html>

Open in new window

Most Valuable Expert 2011
Author of the Year 2014
Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION
Top Expert 2004

Author

Commented:
Thank you guys - all is working perfectly now. The fragment seems to be a really nice way to handle that.
Unlock the solution to this question.
Join our community and discover your potential

Experts Exchange is the only place where you can interact directly with leading experts in the technology field. Become a member today and access the collective knowledge of thousands of technology experts.

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.