grazie abi 
ho risolto così con il tuo pattern
Codice PHP:
$a='[b]questo sarà un [i]test[/i][/b]';
$b='questo è un test';
function HTMLconvert3($text)
{
$finded =array();
$filtered =array();
$pattern="/(<\/?\w+\s*[^>]*\/?> )?([^<>]*)/mis";
preg_match_all($pattern, $text, $strings, PREG_SET_ORDER);
foreach($strings as $arr)
{
if( !empty($arr[2]) ) $finded[]=$arr[2];
}
$elements=array_unique($finded);
foreach($elements as $el)
{
if (substr($el,0,1) !='/' && !in_array("/$el",$elements))
{
$filtered[]=$el;
}
}
foreach($filtered as $s_key=>$s_val)
{
if(mb_detect_encoding($s_val)=='UTF-8')
{$s_val=iconv('UTF-8', "ISO-8859-1//TRANSLIT",$s_val);}
else
{$s_val=iconv('ISO-8859-1', mb_detect_encoding($s_val)."//TRANSLIT",$s_val);}
$entities[$s_key]=htmlentities($s_val);
}
$text=str_replace($filtered,$entities,$text);
return ($text);
}
echo HTMLconvert3($a);
echo HTMLconvert3($b);
?>
sinceramente è un pò macchinosa ma funziona