Hallo trunx!
puh, ich bleibe wohl besser erstmal bei meiner while-Schleife, obwohl ich allerdings glaube, hier wurde mit Spatzen auf Kanonen geschossen...:-)
Nein - ich kann doch nichts dafür, dass es nun mal so ist, wie es ist :-)
Ein String, der formal einem Attribut entspricht kann nun einmal nicht nur als Attributknoten auftreten, sondern beispielsweise auch in einem CDATA-Knoten. Und deswegen wird es komplex. Es geht bei einem Regulären Ausdruck ja nicht nur darum, das zu treffen, was man treffen will, sondern auch immer darum das nicht zu treffen, was man nicht treffen will. Man muss zwingend einen Elementknoten beschreiben, damit man wirklich nur Attribute trifft. Und "innerhalb" des Elementknotens, dann das gewünschte Attribut, wobei davor und dahinter weitere Attribute stehen können.
Aaaaaber, du kannst das vereinfachen, wenn, aber nur wenn, du sagen kannst »Ein String, der formal einem Attribut entspricht, kommt tatsächlich nur als Attributknoten vor«.
Dann könntest du einfach folgendes Muster nehmen:
»s+ style \s*=\s* (["'])[^<]*?\1«
Wenn du das nicht ausschliessen kannst, dann könntest du noch folgendes machen, zuerst alle Elementknoten (Starttags), die Attribute haben, auswählen ...
»< [^\s/>]+ (?: \s+[^\s=]+ \s*=\s* (["'])[^<]*?\1 )* \s*/?>«
... und diese dann in einer Schleife durchlaufen und die style-Attribute entfernen. Und natürlich noch den Original-Elementknoten durch den veränderten Elementknoten ersetzen.
Aber wie bereits mehrfach gesagt wurde, am einfachsten geht so etwas per DOM.
Gruß Uwe