Più conciso di così non ci riesco.
Codice PHP:
$stringa = "questa è una stringa [b]e questo è il testo in grassetto che contiene[/b] contenuto";
// ?: serve per fare in modo che cerchi il testo racchiuso tra [b] e [/b]
// ma senza conteggiare la b iniziale e la b finale
preg_match("#(?:[b])(.*)(?:</b)>#i",$stringa,$ris);
preg_match_all("#\w+#",$ris[1],$words);
$str = implode(',',array_map(create_function('$elm','return strlen($elm);'),$words[0]));
echo $str;
quota il messaggio per copiarlo perchè il forum, oltre a mangiarsi come sempre il backslash prima della w, ha anche aggiunto uno spazio tra [b] e la parentesi che non ci vuole. 
Edit. Domanda per gli esperti di espressioni regolari: è possibile ottenere le singole parole racchiuse tra due tag, come in questo caso, con una sola regexp?
Grazie.