note 108976 modified in function.strip-tags by danbrown
| From: | danbrown@php.net | Date: | Fri, 08 Jun 2012 20:15:21 +0000 |
| Subject: | note 108976 modified in function.strip-tags by danbrown | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-188484@lists.php.net to get a copy of this message | ||
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; 	} ?>
--was--
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.
<pre>
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;
}
</pre>
http://php.net/manual/en/function.strip-tags.php