# 6.3 Praktische Beispiele und Übungen

Reguläre Ausdrücke müssen eingeübt werden, damit die Syntax sich festigt.

Praktische Beispiele für reguläre Ausdrücke | Erklärung
--- | ---
`preg_replace('/^\s*$/', '' , $datei);` | Löscht alle Leerzeilen einer Datei
`preg_replace('/^#.*$/', '' , $datei);` | Löscht alle einzeiligen Kommentarzeilen einer Datei
`preg_replace('/^.*\//', '' , $pfad);` | Entfernt in absoluten Pfaden die Verzeichnisse und lässt den Dateinamen übrig
`preg_match('/^\d{5}$/', $feld);` | Überprüft ein PLZ-Formularfeld auf 5 Digits
`preg_match('/^\S+@\S+\.[A-Z]{2,6}$/i', $feld);` | Einfache Überprüfung eines E-Mail-Formularfeldes
`preg_match('/^#[0-9A-F]{3}([0-9A-F]{3})?$/i', $farbe)` | Überprüft einen HTML-Hexcode für Farben (sowohl 3-stellig als auch 6-stellig)

Sehr viele professionelle Beispiele finden sind im Buch:

- Goyvaerts, Jan; Levithan, Steven (2010): Reguläre Ausdrücke Kochbuch [detaillierte Lösungen für acht Programmiersprachen; mit Einstiegs-Tutorial]. O'Reilly Verlag.

## Erste Übungsaufgaben

Verwendet wird: `preg_replace($suchmuster, $ersetzen, $text)`.
Wie lautet das Ergebnis?

Übung 1

Text: Er, sein Name ist Eric, ist 23 Jahre alt
Suchmuster: `/\W.*/`
Ersetzen: `' '`

Lösung zu Übung 1

Ergebnis: Er
Löscht von der ersten Stelle an, an der ein Zeichen vorkommt, das nicht zu einem Wort gehört. Von dort an bis zum Ende der Zeile.

Übung 2

Text: Er, sein Name ist Eric, ist 23 Jahre alt
Suchmuster: `/,.*/`
Ersetzen: `' '`

Lösung zu Übung 2

Ergebnis: Er
Alle Zeichen hinter dem ersten Komma und das Komma werden gelöscht.

Übung 3

Text: Er, sein Name ist Eric, ist 23 Jahre alt
Suchmuster: `/.,.{3}/`
Ersetzen: `' '`

Lösung zu Übung 3

Ergebnis: Ein Name ist Erit 23 Jahre alt
Der reguläre Ausdruck geht zum ersten Komma. Von dort aus werden gelöscht: ein Zeichen vor dem Komma, das Komma und drei Zeichen nach dem Komma. Da wir kein `$limit` (siehe Einfaches Beispiel für preg_replace()) angegeben haben, werden alle Treffer gelöscht. Somit geht der reguläre Ausdruck auch zum zweiten Komma und löscht dort entsprechend.

Übung 4

Text: Er, sein Name ist Eric, ist 23 Jahre alt
Suchmuster: `/,.*,/`
Ersetzen: `' '`

Lösung zu Übung 4

Ergebnis: Er ist 23 Jahre alt
Der reguläre Ausdruck geht vom ersten bis zum letzten Komma und löscht dazwischen alles.

Übung 5

Text: Er, sein Name ist Eric, ist 23 Jahre alt
Suchmuster: `/,.*?,/`
Ersetzen: `' '`

Lösung zu Übung 5

Ergebnis: Er ist 23 Jahre alt
Der reguläre Ausdruck geht vom ersten bis zum nächsten Komma und löscht dazwischen alles.

Übung 6

Text: Meier, Eric ist 23 Jahre alt
Suchmuster: `/(\w*),\s(\w*)/`
Ersetzen: `"$2 $1"`

Lösung zu Übung 6

Ergebnis: Eric Meier ist 23 Jahre alt
Im Ausdruck `(\w*)` werden alle Buchstaben des ersten Wortes gefunden (hier: Meier) und in der Variablen `$1` automatisch gespeichert. Dann folgen im Suchmuster Komma und Leerzeichen, gefolgt von den Buchstaben des zweiten Wortes (hier: Eric), das in `$2` gespeichert wird.

## Nachvollziehen von Lösungen

Gegeben sind Aufgaben mit Lösungen. Sie sollen die unterstrichene Lösung nachvollziehen können.

PHP-Funktion | Suchstring | Text
--- | --- | ---
`preg_match()` | `/[^mas]{4}/` | "Wer was macht, macht was"
`preg_match()` | `/W.+/` | "Wer was macht, macht was"
`preg_match()` | `/\w+/` | "Wer was macht, macht was"
`preg_match()` | `/.\./` | "Zwischen 1.220 und 1.300 Euro"
`preg_match()` | `/\D.{5}/` | "Zwischen 1.220 und 1.300 Euro"
`preg_match()` | `/\b\W.*0/` | "Zwischen 1.220 und 1.300 Euro"
`preg_match()` | `/[A-Z][a-z]\d/` | "Zwischen 1.220 und 1.300 Euro" (kein Treffer)
`preg_match()` | `/(Text|Briefe)/` | "Dies ist ein Text einer 1. Testseite"
`preg_match()` | `/[a-z]{3}$/` | "Dies ist ein Text einer 1. Testseite"
`preg_match()` | `/\d\.\s\w\w\w/` | "Dies ist ein Text einer 1. Testseite"
`preg_match()` | `/(\s\w+){2,3}/` | "Dies ist ein Text einer 1. Testseite"
`preg_match()` | `/\w.\s\w{1,3}/` | "Dies ist ein Text einer 1. Testseite"

Lösung zu Aufgabe 2

Der reguläre Ausdruck `/W.+/` fängt mit `W` an, gefolgt von einem oder mehreren Zeichen. Dies trifft auf den gesamten Text "Wer was macht, macht was" zu, da `W` am Anfang steht und der Rest des Textes mehrere Zeichen umfasst.

## Weitere Übungsaufgaben

Aufgabe

Zeigen Sie anhand von eigenen Beispielen:

(a) den Unterschied zwischen `/Ha.?s/` und `/Ha.+s/`

(b) den Unterschied zwischen `abc*` und `(abc)*?`

Übung

Nutzen Sie anstelle der Quantoren `*`, `+`, `?` das Wiederholungsintervall `{}`:

Wie lautet das Wiederholungsintervall für den Quantor `*`?

Wie lautet das Wiederholungsintervall für den Quantor `+`?

Wie lautet das Wiederholungsintervall für den Quantor `?`

Lösung zu Übung

Wie lautet das Wiederholungsintervall für den Quantor `*`: `{0,}`

Wie lautet das Wiederholungsintervall für den Quantor `+`: `{1,}`

Wie lautet das Wiederholungsintervall für den Quantor `?`: `{0,1}`

Gegeben sind Aufgaben ohne Lösungen. Die Lösungen ermitteln Sie bitte über ein Web-Interface für reguläre Ausdrücke.

Reguläre Ausdrücke: Aufgaben zum Selbstlösen

PHP-Funktion | Suchstring | Text
--- | --- | ---
`preg_match()` | `/.../` | "Dagobert Duck, Donald Duck u.s.w."
`preg_match()` | `/.*,./` | "Dagobert Duck, Donald Duck u.s.w."
`preg_match_all()` | `/u.{3}/` | "Dagobert Duck, Donald Duck u.s.w."
`preg_match_all()` | `/.\s/` | "Dagobert Duck, Donald Duck u.s.w."
`preg_match_all()` | `/D\w+/` | "Dagobert Duck, Donald Duck u.s.w."
`preg_match()` | `/\s.*\s/` | "Zwei Zwerge zeigen zwanzig Zehen"
`preg_match()` | `/\b[a-z].*?\s/` | "Zwei Zwerge zeigen zwanzig Zehen"
`preg_match()` | `/\D+/i` | "Zwei Zwerge zeigen zwanzig Zehen"
`preg_match_all()` | `/Z/i` | "Zwei Zwerge zeigen zwanzig Zehen"
`preg_match_all()` | `/D\w+/` | "Zwei Zwerge zeigen zwanzig Zehen"