Mein erster Tipp: Nimm
HTML::TreeBuilder dafuer. Das erspart solche Regexes und erlaubt einen wesentlich zivilisierteren Umgang mit HTML.
So, ich gehe davon aus, du hast jetzt in die Manpage von HTML::TreeBuilder geschaut, du verstehst nix und moechtest doch lieber deine Regex weiter benutzen. ;) (Den naechsten Versuch mit HTML::TreeBuilder wirst du machen, wenn sich die zu parsende Webseite syntaktisch etwas aendert und du gezwungen bist, deine ganze Regex neu zu schreiben. Glaub mir, ich spreche aus Erfahrung.)
Dann halt ein paar Tipps zu deiner Regex:
- Warum musst du 38 Subexpressions sammeln, obwohl du nur gerade mal 13 davon separat benutzt und der Rest in Folgen der Art "$10$11$12$13$14$15" wieder auftaucht? Da kannst du doch gleich alles in einer Klammer zusammenfassen. Wenn du keine Zeilenumbrueche einfuegst, sind es sogar nur sieben separate Ausdruecke, die du brauchst (wenn ich richtig gezaehlt habe).
- Sowas: [tt](<\/
+[Dd]+>)
ist nicht nur ueberfluessig kompliziert, sondern sogar falshc. Das matcht naemlich nicht nur
</td> und
</TD>, sondern auch
</tttTTTtdDDd>. Wahrscheinlich meinst du das: [tt](<\/
[Dd]>)
Und auch das kann man noch einfacher schreiben. Setze hinter die Ersetzung noch ein "i", dann wird Gross-/Kleinschreibung beim Match ignoriert und du kannst es einfach so schreiben:
(<\/td>).
Andererseits: Warum muss das ueberhaupt in einer Variable gespeichert werden, wenn's doch nur ein
</td> sein kann?
- Das hier ist auch viel zu kompliziert:
(<[Ii]+[Mm]+[Gg]+ [Ss]+[Rr]+[Cc]+[a-zA-Z0-9:;&§,-_#% \?\.\"\'\=\_]*">)
Daraus wuerde ich Folgendes machen:
<img src="(.*?)">
Das mit dem Modifier "i" gilt wie oben. Und eingefangen wird hier nur die URL des Bildes (sofern keine anderen Parameter vorkommen), die du dann bequem weiter verwenden kannst. Evtl. wuerde ich im Muster statt des Leerzeichens ein "\s+" einsetzen, das passt dann auch auf mehr als ein Leerzeichen, Tabs und Zeilenumbrueche.
Ach ja, hatte ich schon darauf hingewiesen, dass man sowas besser mit
HTML::TreeBuilder macht? ;)