Nell'ipotesi che tu NON abbia tag nidificati *** puoi provare cosė:

codice:
$myHtml=preg_replace(	
		'/(.*?)(\[([a-z]+)\].*?\[\/\\3])/ise'
		,'nl2br("$1")."$2"'
		,$myHtml
	);
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.


edit:*** cioč in teoria non matcha correttamente solo nel caso di medesimi tag nidificati.