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.