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$stringsPREG_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