Разликата е че се използват различни метасимволи("*","+") наречени още алчни."*" намира нула или повече съвпадения с предходния сивмол,"+" намира ЕДНО или повече съвпадения с предходния символ в случая метасимвола "." който пък от своя страна намира съвпадение със всеки символ раличен от нов ред.Казано по-просто с .+? задължаваш да има символ между bb tags за да го замени с html таговете:
$text ='';
$text = preg_replace("/\[b\](.+?)\[\/b\]/i", '<b>$1</b>',$text);
echo $text; // няма да се извърши замяна
$text ='d';
$text = preg_replace("/\[b\](.+?)\[\/b\]/i", '<b>$1</b>',$text);
echo $text; // ще се извърши замяна
$text ='';
$text = preg_replace("/\[b\](.*?)\[\/b\]/i", '<b>$1</b>',$text);
echo $text; // ще се извърши замяна
$text ='d';
$text = preg_replace("/\[b\](.*?)\[\/b\]/i", '<b>$1</b>',$text);
echo $text; // ще се извърши замяна
Другия метасимвол "?" намира нула или 1 съвпадение с предходния символ.Тук обаче се използва да ограничи алчността на метасимволите "*","+".Също е важно да се отбележи, че след като си използвал режима(флага) "s" който позволява на метасимвола "." да намира съвпадение и с нов ред то в първия случай с ".+?" ще се намери съвпадение и ако има само нов ред между таговете :
$text ='
';
$text = preg_replace("/\[b\](.+?)\[\/b\]/is", '<b>$1</b>',$text);
echo $text; // ще се извърши замяна заради флага "s"
Гледай сорс кода на страницата за да виждаш какво всъщност става.И както ти казвах преди правиш излишни ескейпвания на символи:
$text = preg_replace("/\[b\](.*?)\[\/b\]/i", '<b>$1</b>',$text);
и
$text = preg_replace("/\(.*?)\[\/b]/i", '<b>$1</b>',$text);
е абсолютно еднаквo, достатъчно е едно ескейпване на метасимволите "[","]" за да може да се развали конструкцията на клас и да се считат за обикновенни символи.