Nell'ipotesi che tu NON abbia tag nidificati *** puoi provare cosė:
nel caso tu voglia una vera e propria sostituzione allora ti conviene usare preg_replace_callback (togliendo il modificatore "e" dall'espressione) e crearti una funzioncina di callback al posto di nl2br.codice:$myHtml=preg_replace( '/(.*?)(\[([a-z]+)\].*?\[\/\\3])/ise' ,'nl2br("$1")."$2"' ,$myHtml );
edit:*** cioč in teoria non matcha correttamente solo nel caso di medesimi tag nidificati.