I use this function substr(tbarticles.articlebody,1,200) as description1
in a query but for some articles I see that the table layout change and page layout also change. It seems that it counts html characters also. Please let me know how can I fix it?
I used also mb_substr
but it doesn't return anything for description1
.
As @Rocket says you will need to use php, here is a function taken from a similar question:-
function html_cut($text, $max_length)
{
$tags = array();
$result = "";
$is_open = false;
$grab_open = false;
$is_close = false;
$in_double_quotes = false;
$in_single_quotes = false;
$tag = "";
$i = 0;
$stripped = 0;
$stripped_text = strip_tags($text);
while ($i < strlen($text) && $stripped < strlen($stripped_text) && $stripped < $max_length)
{
$symbol = $text{$i};
$result .= $symbol;
switch ($symbol)
{
case '<':
$is_open = true;
$grab_open = true;
break;
case '"':
if ($in_double_quotes)
$in_double_quotes = false;
else
$in_double_quotes = true;
break;
case "'":
if ($in_single_quotes)
$in_single_quotes = false;
else
$in_single_quotes = true;
break;
case '/':
if ($is_open && !$in_double_quotes && !$in_single_quotes)
{
$is_close = true;
$is_open = false;
$grab_open = false;
}
break;
case ' ':
if ($is_open)
$grab_open = false;
else
$stripped++;
break;
case '>':
if ($is_open)
{
$is_open = false;
$grab_open = false;
array_push($tags, $tag);
$tag = "";
}
else if ($is_close)
{
$is_close = false;
array_pop($tags);
$tag = "";
}
break;
default:
if ($grab_open || $is_close)
$tag .= $symbol;
if (!$is_open && !$is_close)
$stripped++;
}
$i++;
}
while ($tags)
$result .= "</".array_pop($tags).">";
return $result;
}
Edit: I suspect the reason your page layout is changing is because substr is breaking your html. What you need to do is return all of tbarticles.articlebody
and once you have it in a variable in the php (e.g. $result['articlebody']
) then use the function below to trim it to the correct length.
So something like:-
# Get entire field from database, don't use substr
$result = mysql_query("SELECT tbarticles.articlebody as description1 FROM your_table");
$row = mysql_fetch_array( $result );
# Now make the description the correct length using the function above
$short_description = html_cut($row['description1'], 200);
Hope this helps.