Resource icon

Reguläre Ausdrücke - Teil 2

Quantifier

Quantifier erlauben für ein oder mehrere Zeichen die Angabe ein minimalen, maximalen oder exakten Anzahl dieser. Wird kein Quantifier angegeben, so wird davon ausgegangen, dass das Zeichen einmal vorhanden sein muss.

*
Der Stern steht für eine Anzahl von 0 oder mehr Zeichen
Beispiel: /.*/
Trifft auf jede beliebige Zeichenkette (auch auf leere) zu.

+
Das Pluszeichen steht für eine Anzahl von 1 oder mehr Zeichen
Beispiel: /a+/
Trifft auf jede Zeichenkette zu, die mindestens ein a enthält.

?
Das Fragezeichen steht für eine Anzahl von 0 oder exakt 1
Beispiel: /^(test)?$/
Steht für die Zeichenkette „test“ und nur für diese. Auf Grund des ? und der Einschränkung durch ^ und $ ist z.B. „testtest“ nicht denkbar.

{n}
Steht für genau n Zeichen.
Beispiel: /a{3}/
Steht für exakt drei a hintereinander.

{n,}
Steht für mindestens n Zeichen.
Beispiel: /a{1,}/
Steht für mindestens ein a und ist somit gleichbedeutend mit /a/ und /a+/

{n,m}
Steht für mindestens n, aber maximal m Zeichen.
Beispiel: /a{1,3}/
Steht für alle Zeichenketten, die 1, 2 oder 3 a’s hintereinander enthalten.

Charakterklassen

Eine Charakterklasse gibt eine Auswahl von erlaubten Zeichen an.

Beispiel: /^a[xy]$/

Dies trifft auf ax und ay zu. Zwar könnte man hier auch noch ohne weiteres mit einer normalen runden Klammer und einem | agieren, im folgenden Beispiel wird es allerdings evtl. schon deutlicher, wo der Vorteil von Charakterklassen liegt.

Beispiel: /^a[0-9]$/

Dieses Muster passt auf a0, a1, a2, ..., a9 und damit sollte der Vorteil von Charakterklassen endgültig klar sein.
Gleichzeitig haben wir hier eines von zwei Sonderzeichen in einer Charakterklasse kennengelernt, nämlich den Bindestrich - . Der Bindestrich gibt, wie man es sich auch logischerweise denken könnte eine Reichweite an.

Beispiel: /^[a-zA-Z]+$/

Dieses Pattern trifft also auf alle Zeichenketten aus Buchstaben zu, jedoch dürfen keine Zahlen enthalten sein. Wollte man das ganze um Zahlen erweitern, so müsste man

[a-zA-Z0-9]

nutzen. Wenn man nun noch bestimmte Sonderzeichen hinzufügen kann, so kann man diese einfach zusätzlich hineinschreiben.

[0-9+-*\/]

Würde also auf alle Zeichen eines einfachen Taschenrechners ansprechen.
Dabei muss der / durch einen vorrangestellten \ maskiert werden, sofern ihr den / als Pattern-Delimiter nutzt.

Das zweite Sonderzeichen in Charakterklassen ist der Zirkumflex ( ^ ). Dies ist wiederum ein etwas verwirrender Punkt, da der Zirkumflex ja eigentlich den Beginn der Zeichenkette markiert. In einer Charakterklasse hat ^ allerdings eine negierende (verneinende) Aufgabe.

Beispiel: /^a[^bc]$/

Dieses Muster triff auf alle Zeichenketten zu, die ein a Anfang haben, ausser ab und ac.

Backreferences

Backreferences sind, wie die Übersetzung schon sagt, Rückbezüge. Und zwar sind es Rückbezüge, die sich auf einen vorangegangenen Teil des Patterns (in runden Klammern) bezieht und den Inhalt dieser (Klammer) enthält. Dazu gibt es generell zwei verschiedene Arten der Syntax. Die neuere davon ist $n, die ältere \\n, wobei n für die n-te Klammerngruppe steht.
Beispiel: !(<b>|<i>>)(.*?)(</$1>)!

Dieses Muster trifft also auf <b>test</b> aber auch <i>test</i>, nicht aber auf <b>test</i> zu.

Wirklichen Sinn machen die Backreferences aber eher bei der Verwendung von preg_replace().

Beispiel:
PHP:
$str = preg_replace("!-start-(.*?)-end-!","<anfang>$1</ende>",$str)
Dieses Konstrukt würde uns also aus einer Zeichenkette -start-trullala-end- folgendes machen: <anfang>trullala</ende>.

Und weil praktische Beispiele immer am besten dazu dienen sich eine Sache klarzumachen, checken wir im folgenden Beispiel ob eine eingegebene Handynummer ein korrektes Format hat.

Dazu macht man sich zunächst Gedanken über die grundlegende Struktur einer Handy Nummer.

- Sie beginnt stets mit 01
- Auf die 01 folgt (zum momentanen Zeitpunkt) eine 6 oder 7
- Danach folgt eine beliebige Zahl
- Dann folgt, je nachdem wie ihr es wollt ein Trennzeichen, ich werde auf einen / testen
- Danach folgen sieben beliebige Zahlen (falls das nicht der Norm entspricht, denkt euch halt das entsprechende Richtige)

Beispiel:
PHP:
$pattern = "/^(01)(6|7)([0-9])\\/([0-9]{7})$/";
Kurz zur Erläuterung. Die einzelnen Segmente sind geklammert, damit man sie später über den Backreference ansprechen kann.
Wie wir sehen, beginnt das Muster, auf das wir testen, mit 01. Gefolgt von einer 6 oder 7, was wir durch (6|7) ausdrücken. Danach folgt eine beliebige Zahl. Wir drücken dies einfach durch die Charakterklasse [0-9] aus. Den Quantifier können wir uns sparen, da ja nur ein Zeichen vorhanden sein muss.
Danach folgt ein /, den wir allerdings mit einem vorangestellten \ escapen müssen, da er sonst als Delimiter gelten würde.
Danach folgen genau sieben Zeichen aus der Charakterklasse [0-9].

Gehen wir mal davon aus, dass uns eine Usereingabe der Handynummer in der Variable $_POST[’handy’] vorliegt, dann würden wir z.B. folgenden Code nutzen.
PHP:
$pattern = "/^(01)(6|7)([0-9])\/([0-9]{7})$/";
if(preg_match($pattern, $_POST['handy'])) {
  echo "gültige Handynummer";
}
else {
  echo "Die eingegebene Nummer entspricht nicht dem gültigen Format.";
}
Ich hoffe, ich habe euch einen kleinen Einblick in die Welt der Regular Expressions geben können.
Bei Anregungen und Verbesserungen zu diesem Tutorial, schreibt mir einfach eine PN oder E-Mail.

Ergänzung von Nils Hitze:
Noch ein paar Links zum Thema reguläre Ausdrücke :
  1. http://www.regular-expressions.info/tutorial.html
  2. http://weitz.de/regex-coach

Teil 1: http://www.tutorials.de/resources/regulaere-ausdruecke-regular-expressions-regex-mit-php.19/
Autor
Tim C.
Aufrufe
1.204
First release
Last update
Bewertung
0,00 Stern(e) 0 Bewertungen

More resources from Tim C.

Zurück