Verdiğin kod aslında sorunsuz şelilde çalışıyor

Fakat şuan sadece regexp tek satır üzerinde çalışır. Yani $gelen değişkeni birden fazla satır içeriyorsa, birinci satırda [ B ], ikinci satırda [ /B ] bulunursa bunları görmezden gelicektir. Bu yüzden tek eksiği regex de Us değiştiricilerinide eklemen. Yani kod şöyle olacak
$gelen = preg_replace("/\[B\](.*?)\[\/B\]/Usi", "<b>$1</b>", $gelen);
@BHcoder yanlış anlama sadece bunun eksik yanını söylüyorum.
Bu kod çalışır fakat eksik bir yanı var. Kelimeleri sadece replace ederek çalışıyor bu sistem. Bu yüzden bir tag kapatılmaz ise, replace işleminde kapatma işlemi gerçekleşmeyeceğinden dolayı hatalara sebep olacaktır. Yani örnek verecek olursak;
[ CENTER ][ B ] deneme yazısı [ /B]
Görüldüğü gibi CENTER komutu kapatılmadı. Bunun çıktısı aynen şu şekilde olacaktır.
<div align="center"><b>deneme yazısı</b>