Nach einer etwas längeren Pause geht es heute endlich weiter mit meiner Serie zu Mod_Rewrite. Nachdem es im letzten Teil der Serie noch um den grundsätzlichen Nutzen von Mod_Rewrite ging, geht es heute mit den regulären Ausdrücken ans Eingemachte.
Ich werde dir in diesem Artikel die Bedeutung von regulären Ausdrücken erklären und die wichtigsten Regeln für Mod_Rewrite vorstellen.
Überblick über die Artikel-Serie
- Mod_Rewrite Tutorial Teil 1 – Was bringt es?
- Mod_Rewrite Tutorial Teil 2 – Reguläre Ausdrücke
Was sind reguläre Ausdrück?
Reguläre Ausdrücke werden in der Programmierung an zahlreichen Stellen benutzt, wenn ein Text mit einem Muster verglichen werden soll.
Solltest du schon mal auf einer Webseite deine E-Mail-Adresse eingeben, wolltest sie aber nicht preisgeben und hast nur „gdfgdfe“ eingegeben? Kam die Webseite dann mit einerm Meldung, dass du keine gültige E-Mail-Adresse eingegeben hast? Dann ist dir sehr wahrscheinlich ein regulärer Ausdruck auf die Schliche gekommen.
Wahrscheinlich kennst du auch den *, der für beliebige Zeichen stehen kann. Den gibt es auch in regulären Ausdrücken. Es können aber auch sehr komplexe Muster gebildet werden nach dem Motto: Erst beliebig viele Buchstaben und Zahlen aber kein @, dann ein @, dann nochmal mindestens ein Buchstabe, dann ein Punkt und dann nochmal mindestens 2 Buchstaben. Ja, das ist eine E-Mail-Adresse. Die vielen Möglichkeiten haben aber leider auch die Folge, das reguläre Ausdrücke furchtbar unübersichtlich sind und nach Raketenwissenschaft aussehen.
Ich muss dazu sagen, dass sich auch viele Programmierer mit regulären Ausdrücken schwer tun und die Regeln immer wieder nachschlagen müssen. Die Möglichkeiten sind sehr umfangreich und ich werde hier auch nur die für Mod_Rewrite wichtigen Basics vorstellen.
Was hat das mit Mod_Rewrite zu tun?
Mod_Rewrite verwendet reguläre Ausdrücke um URL Muster aufzustellen. Möchtest du eine Reihe von URLs umleiten, musst du also nicht für jede einzelne URL eine eigene Regel aufstellen. Stattdessen kannst du z.B. alle URLs die nach dem Muster http://example.com/seitenname/ aufgebaut sind auf http://example.com/seitenname.php umleiten. Eine Zeile genügt und auch http://example.com/kontakt/ und http://example.com/wasweissich/ werden korrekt umgeleitet.
Du wirst natürlich nicht gezwungen diese Ausdrücke zu verwenden. Du kannst auch für jede einzelne URL eine eigene Regel aufstellen. Was besser ist, hängt von dem Aufbau deiner Seite ab.
Wie sind die Muster aufgebaut?
Im Prinzip besteht ein Muster aus den gesuchten Zeichen. So ist z.B. der Ausdruck „jeans“ schon ein regulärer Ausdruck. Es gibt aber eine Reihe von reservierten Zeichen, die als Platzhalter verwendet werden können. Hier die wichtigsten:
Zeichen | Bedeutung | Beispiel |
---|---|---|
^ | Anfang der URL | Alle URLs die mit „jeans“ anfangen Treffer: /jeans-herren, /jeansgroessen ^jeans |
$ | Ende der URL | Alle URLs die mit „groessen“ aufhören Treffer: /groessen, /jeansgroessen groessen$ |
x+ | Der Ausruck x 1 oder mehrmals | Alle URLs in denen die Zahl 3 vorkommt Treffer: /jeans-3, /33-tipps-zur-jeans 3+ |
x* | Der Ausruck x 0, 1 oder mehrmals | Beliebig viele / am Ende der URL Kombi mit $ Treffer: /jeans//, /hosen /*$ |
x? | Der Ausruck x 0 oder 1 Mal | URLs mit oder ohne / am Ende Kombi mit $ Treffer: /jeans/, /jeans /?$ |
[xyz] | Eins der Zeichen x, y oder z | URL beginnt mit einer Zahl Kombi mit ^ Treffer: /3-jeans-zum-preis-von-1, /7-tipps-zur-jeans-auswahl ^[0123456789] |
[x-y] | Eins der Zeichen von x bis y | URL beginnt mit einem Buchstaben Kombi mit ^ Treffer: /jeans, /hosen ^[a-z] |
[^x-y] | Keins der Zeichen von x bis y | URL endet nicht mit einer Zahl von 0-3 Kombi mit $ Treffer: /jeans-groesse-7, /hosen [^0-3]$ |
. | Ein beliebiges Zeichen | URL beginnt mit j, endet mit s und hat beliebige Zeichen dazwischen Kombi mit ^ $ + Treffer: /jeans, /jonas-schreibt-ueber-dies-und-das ^j.+s$ |
\ | Das nächste Zeichen wird nicht als reserviertes Zeichen benutzt (escape) | URL enthält ein +\+ |
Bei dieser Aufstellung will ich es zunächst belassen und für viele Mod_Rewrite Aufgaben kommt man damit auch aus. Im Verlauf dieser Serie wird noch das ein oder andere Zeichen dazu kommen, aber vorerst ist das denke ich genug Input.
Puh! Und was kann ich jetzt damit machen?
Hier ein paar Beispiele, wie man diese Zeichen kombinieren kann:
- Alle .html URLs (Anfang, beliebig viele Zeichen, ein ., html, Ende)
^.+\.html$
- Einfach alle URLs (Anfang, beliebig viele oder auch gar keine Zeichen, Ende)
^.*$
- URLs, die mit jeans anfangen und dahinter 2 Zahlen mit beliebig vielen Stellen haben, jeweils getrennt durch Bindestriche (Anfang, jeans, -, Zahl, -, Zahl, Ende)
^jeans\-[0-9]+\-[0-9]+$
Hä?
Ich weiß, der letzte Ausdruck geht schon wieder in die Richtung schwarze Magie und du bist jetzt vielleicht in der Versuchung das Thema an der Stelle aufzugeben. Aber wenn du den Ausdruck Schritt für Schritt analysierst ist es eigentlich keine Zauberei:
^jeans
Klar, fängt mit jeans an\-
Das Zeichen -. Da – ein reserviertes Zeichen ist, muss \ davor stehen[0-9]+
Beliebig viele Ziffern, das + bezieht sich auf den gesamten Ausruck [0-9]\-[0-9]+$
Noch ein Bindestrich und eine Zahl (siehe oben) und das Ende der URL
Fazit
Schon klar, das Thema ist am Anfang ziemlich mühsam, vor allem wenn man die Regeln noch nicht praktisch anwenden kann. Wenn du diesen Artikel halbwegs verstanden hast, ist das Schlimmste aber geschafft. Im 3. Teil der Serie wird die graue Theorie dann in die Praxis umgesetzt und du kannst die ersten Früchte deiner Arbeit ernten.
Nochmal: Reguläre Ausdrücke sind nicht einfach! Sie gehören zu den kompliziertesten Themen in der Programmierung und es gibt regelrechte Programmier-Wettbewerbe wer den besten Ausdruck schreibt. Für effektive URL Umleitungen sind sie aber auch verdammt nützlich und wichtig.
Gib also jetzt nicht auf! Verwirrte Fragen in den Kommentaren beantworte ich gerne. Es gibt keine dummen Fragen bei dem Thema.