Hallo, Cheatah,
Nee, ich glaube nicht, dass ich den Fehler suchen will.
Die RegExp wurde nur der Lesbarkeit wegen umgebrochen.
Sag bloß! ;) Ja, das ist mir durchaus aufgefallen.
Korrekt ist sie nur dann, wenn die Umbrüche wieder entfernt werden und der Code somit in einer einzigen Zeile steht.
<rechtfertigung>
Deshalb habe die Zeilenumbrüche vor dem ersten Test entfernt. Daraufhin wurde ein Fehler ausgegeben, den ich mir absolut nicht erklären konnte, woraufhin ich einen Fehler beim Entfernen der Zeilenumbrüche vermutete. Daraufhin entfernte ich sie erneut, der Fehler blieb aber bestehen. Nun wechselte ich den Delimiter und immerhin änderte sich der Fehler *fg*. Erst als ich die RegExp wieder mit den Umbrüchen verwendete, wurde ein einigermaßen verständlicher Fehler ausgegeben, nämlich einer im Regulären Ausdruck selbst (siehe Posting).
Naja, lange Rede, kurzer Sinn, gerade probierte ich es noch einmal (mit verschiedenen Delimitern) und es geht, grummel. Dabei hatte ich schon von Anfang an Delimiter benutzt, welche selbst nicht in der RegExp vorkamen.
</rechtfertigung>
Die Performance ist natürlich äußerst suboptimal[tm]. Nach 5000 Testdurchgängen bei einer einfachen HTTP-URL mit Query String (preg_match):
lange RegExp: durchschnittlich 0.01552809 Sekunden
kurze RegExp: durchschnittlich 0.00065359 Sekunden
Die Messung beeinträchtigt natürlich das Resultat, aber die Tendenz ist offensichtlich. Selbst wenn die lange RegExp einmal kompiliert und danach schneller ausgeführt wird, wie du sagst, steht dies in keinem Vergleich zur kurzen RegExp:
1. Test: 1: 0.03177 2: 0.00235
2. Test: 1: 0.01850 2: 0.00054
Manchmal braucht die erste RegExp beim ersten Ausführen auch 0,07 Sekunden und beim zweiten Ausführen 0,04 Sekunden.
Ich weiß nicht, wie man innerhalb des Skriptes den Speicher von dem Regexp-Kompilat befreien kann, deswegen sind letztere Untersuchungen manuell durchgeführt worden. Aber die Zeit halbiert sich tatsächlich.
Mathias