note 108976 deleted from function.strip-tags by aharvey
| From: | aharvey@php.net | Date: | Thu, 20 Sep 2012 12:16:55 +0000 |
| Subject: | note 108976 deleted from function.strip-tags by aharvey | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-190934@lists.php.net to get a copy of this message | ||
Note Submitter: frank at interactinet dot com
----
I used substr() to create a summary... for HTML content this is a problem because of unclosed tags
and broken tags (if the content is cut off in the middle of an open or close tag)
I came up with this... I am not sure it works 100% of the time, but it seems to do the trick.
<?php
public static function closetags($html)
{
// strip fraction of open or close tag from end (e.g. if we take first x characters, we might cut
off a tag at the end!)
$html = preg_replace('/<[^>]*$/','',$html); // ending with fraction of
open tag
// put open tags into an array
preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
$opentags = $result[1];
// put all closed tags into an array
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closetags = $result[1];
$len_opened = count($opentags);
// if all tags are closed, we can return
if (count($closetags) == $len_opened) {
return $html;
}
// close tags in reverse order that they were opened
$opentags = array_reverse($opentags);
// self closing tags
$sc =
array('br','input','img','hr','meta','link');
//
,'frame','iframe','param','area','base','basefont','col'
// should not skip tags that can have content inside!
for ($i=0; $i < $len_opened; $i++)
{
$ot = strtolower($opentags[$i]);
if (!in_array($opentags[$i], $closetags) && !in_array($ot,$sc))
{
$html .= '</'.$opentags[$i].'>';
}
else
{
unset($closetags[array_search($opentags[$i], $closetags)]);
}
}
return $html;
}
?>