function closetags($html)
{
$arr_single_tags = array('meta','img','br','link','area');
#put all opened tags into an array
preg_match_all('#<(?!meta|img|br|hr|input\b)\b([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);
$openedtags = $result[1];
#put all closed tags into an array
preg_match_all('#</([a-z]+)>#iU', $html, $result);
$closedtags = $result[1];
$len_opened = count($openedtags);
# all tags are closed
if(count($closedtags) == $len_opened)
return $html;
$openedtags = array_reverse($openedtags);
# close tags
for($i=0; $i < $len_opened; $i++)
{
if (!in_array($openedtags[$i],$arr_single_tags))
{
if(!in_array($openedtags[$i], $closedtags))
{
$html .= '</'.$openedtags[$i].'>';
}
else
{
unset($closedtags[array_search($openedtags[$i], $closedtags)]);
}
}
}
return $html;
}
function checkLast5($string)
{
$last5 = substr($string, -5);
$pos = strpos($last5, "</");
if ($pos === false)
{
return $string;
}
else
{
return substr($string, 0, $pos-5);
}
}Bunlar iki tane fonksiyonum. Önce checkLast5 fonksiyonuyla tamamlanmamış bir etiket var mı kontrol ettirip varsa sildiriyorum. Daha sonra closetags fonksiyonuyla kapatılmamış etiketleri kapattırıyorum.
Tek sorunum şu: Örneğin <span style="color: red"> gibi bir etiket açıksa, sorun yok. </span> olarak kapatıyor. Ancak <span style="colo şeklinde olduğunda öylece bırakıyor. Ve bu da sayfadaki düzeni bozuyor.
__________________________________________________ ______________
ÇÖZÜMÜ
BBCode'ları ayıklarken preg_replace'te [$bbc](.*)[/$bbc] şeklinde ararken [$bbc] ve [/$bbc] şeklinde iki farklı preg_replace ile hallettim.