The problem is that you are using the original input again half-way your processing:
$description = $data['description'];
$description = htmlentities($description);
$description = html_entity_decode($description);
$description = strip_tags($description);
$description = substr($data['description'],0,300);
^^^^^^^^^^^^^^^^^^^^ All previous changes undone!
$description = substr($description,0,strrpos($description,' '));
$description = $description."...";
Apart from that, @redreggae is right, you only need strip_tags
.