A great site to learn about regular expressions is Regular-Expressions.info. I constantly refer back to there when I do some complex regexp's. Anway, on to the fun:
b[/b] -- The (?:...) stuff is a way to group a part of a regexp without actually creating a subset within the match. For example, if I had simply said b[/b], a $Matches[1] array would have been created with the results of this subset. Since there's no reason to have this extra subset of matches, I used the (?:...) syntax to group the pattern, but not actually match it separately. Without grouping it, it would have run into the ".*?" coming up.
.? -- Common in regexp's, this simply says take any character (".") and match it zero or more times ("") but make it non-greedy ("?"). In case you're not familiar with the regexp engine, it is by default a "greedy" engine, meaning it consumes as much of the string as possible. Instead, we want it to stop when it reaches the very next verb so that it doesn't combine all of the phrases into one match.
b[/b] -- Again, I'm using a special syntax here. This time, the '=' sign afther the '?' indicates I'm doing a look-ahead assertion. Basically, I'm saying that this pattern should consume characters until it sees that the next characters it matches would be either $VERBS or the end of the string ($). A look-ahead is needed because we don't want it to include the next verb in this phrase.
/i -- Nothing complex here, just the case-insensitive flag.
Hope this helps!
EDIT: By the way, I forgot to mention this before and in this post: the "." character does not by default match new lines. So, if your string spans multiple lines, the pattern will not work as expected. To fix this and allow the string to span multiple lines, add an 's' (I believe the name for it is the "dot-all modifier") after the 'i' modifier.