Hallo,
$suchmuster = '/(?i)<'.$tag.'>(.*)(?<!</'.$tag.'>)</'.$tag.'>/';
Vielleicht wäre der Einsatz eines XML-Parsers o.ä. eher zu empfehlen. Deine RegExp hat als Schwachpunkt den Teil in der Mitte: (.*) ... diese Regel ist zu schwach um zu bestimmen, ob nun alles zwischen benachbarten sup-/sup-tags oder eben zwischen den entferntesten tags matchen soll. Bei drei solchen gruppen wäre theoretisch auch eine Match zwischen ersten sup und mittlerem /sup möglich.
Die Lookbehind-Assertion trifft ja nur zu, wenn nicht _unmittelbar_ vor dem </sup> ein zweites </sup> liegt. Dank des .* ist diese Assertion aber dann wieder unwichtig, wenn ein weiter entferntes </sup>-Tag diese Bedingung erfüllt.
Ich denke, regexps sind hier überfordert und man sollte gleich zu einem guten xml-parser greifen.
http://de.php.net/manual/de/ref.xml.php
ist grundlegend flink bei der Sache und abgesehen davon, dass er sich an nicht zusammengehörigen Tags (fehlenden Endtags) stört, ist er äußerst brauchbar.
Grüße, Thomas