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.