Zwracam się z prośbą o pomoc w konstrukcji wyrażenia regularnego dla treści

[produkt][ImagePath]ścieżka do obrazka[/ImagePath][ToolTip]Opis po wskazaniu na obrazku[/ToolTip][Content1]Tekst nad obrazkiem[/Content1][Content2]Długi <u>opis produktu</u> wraz ze znacznikami <b>html</b>[/Content2][/produkt]

Mam coś takiego, ale... nie do końca działa :|
  1. preg_replace_callback('|\[produkt\](.*?)\[ImagePath\](.*?)\[\/ImagePath\]\s+\[ToolTip\](.*?)\[\/ToolTip\]\s+\[Content1\](.*?)\[\/Content1\]\s+\[Content2\](.*?)\[\/Content2\]\s+\[\/produkt\]|i', array($this, 'add_element_to_xml'), $params[9]);


To co między znacznikami [], [/] to dowolnej długości tekst.

Edycja:
poprawnie działająca konstrukcja wyrażenia:
  1. |\[produkt\]\w*(\[ImagePath\](.+?)\[\/ImagePath\]?)(\[ToolTip\](.+?)\[\/ToolTip\]?)(\[Content1\](.+?)\[/\Content1\]?)(\[Content2\](.+?)\[/\Content2\]?)\[\/produkt\]|i