Jonny 5: RegEx killt meinen Apache

Beitrag lesen

Hallo Felix,

ich wollte lediglich auf das Problem aufmerksam machen und einem Beispiel demonstrieren, dass es nicht nötig ist, den lookahead an jeder Position auszuführen, um:

wollte ich mit einem regulären Ausdruck alle "unversorgten" Elemente finden.

Mein Beispiel (?is)<input(?![^>]+type=)[^>]+> würde eben die <inputs ohne type= finden. Dachte das möchtest du.

Um nochmal zum Problem zurückzukehren: ~(?is)(<input)((?!type=).)+>~

Da Quantifier default greedy (gierig) sind, würde bei diesem rex und längerer Inputwurst alles, bis zum letzten > gematcht werden und an (?!type=).)+ jeder Position der negative lookahead ausgeführt werden, was ein enormer Aufwand sein kann und eben auch nicht das erwünschte Ergebnis liefert.

Ev hätte es auch schon gereicht den Quantifikator bescheiden/faul zu machen: (?is)(<input)((?!type=).)+?> um zu funktionieren, wäre aber auch unschön.

Dann schriebst du:

Der Fehler in meinem Code war der Punkt. Also nicht so:
~(?is)(<input)((?!type=).)+>~
Sondern so:
~(?is)(<input)((?!type=)[^>])+>~

Durch die Einschränkung auf Zeichen, die kein > sind, wird natürlich die Menge an möglichen lookaheads auf ein konsumierbares Maß reduziert.

Dieses "Hauptsache es funktioniert für dich!" klingt mir zu sehr nach quick&dirty. Das versuche ich in aller Regel zu vermeiden

Ja, wenn du das jetzt so erwähnst, es klingt tatsächlich nicht gut, es geht doch um die Energie des Verstehens und nicht Funktionierens hier :)

Aus der Problembeschreibung ging für mich nicht hervor, wie genau dein Vorgehen geplant ist.

Wünsche einen erholsamen Sonntag,
Jonny 5