Regular Expressions gehören zu den fantastischsten Erfindungen der Software-Industrie. Doch manchmal bereiten sie einem eben auch unnötiges Kopfzerbrechen, wie mir heute. Und da weiss man wieder: Diese Regexes wird man wohl bis ans Lebensende nicht vollumfänglich beherschen!
Die Aufgabenstellung war im Grund gar nicht so kompliziert: Für einen Kunden musste ich mit PHP und preg_match den Inhalt eines bestimmten div-Elements löschen.
Bis ich aber den Pattern zusammen hatte, vergingen wohl über 60 Minuten, in denen ich verbissen unzählige Kombinationen mit Klammern, Punkte, Sternen und Plus-Zeichen ausprobierte.
Hilfreich war dabei das für Mac OS X geschriebene Tool Regexplor, das Strings gemäss den Anweisungen im Pattern farbig hervorhebt.
Die Lösung
Folgendes kam schlussendlich heraus:
/(<div id=\"customer\">.+?<\/div>)/s
Das klitzekleine s am Schluss war die Lösung – es weist PCRE an, den Punkt („matches (almost) any character“) auch auf Newlines (\n) anzuwenden (PHP-Doku). Erst so beendet der Parser seine Arbeit nicht, wenn er auf ein Zeilenende stösst.
Das war eine Zangengeburt!
Tutorials
Ein umfangreiches Tutorial findet sich übrigens unter Regex-Tutorial.