Regular Expressions &

Geschätzte Lektüre: 9 Minuten 361 Ansichten

Regular Expressions (RegEx oder reguläre Ausdrücke) sind wichtige Werkzeuge zur Mustererkennung in Texten. Stellen Sie sich vor, Sie hätten einen riesigen Bücherstapel und wollten alle Seiten finden, auf denen bestimmte Wörter in einer bestimmten Anordnung vorkommen – RegEx ist wie ein superintelligenter Textdetektor, der diese Aufgabe blitzschnell erledigt.

Grundlagen: Was sind Regular Expressions?

Reguläre Ausdrücke sind Suchmuster, die beschreiben, wie Text aufgebaut sein muss, um als „Treffer“ zu gelten. In PHP gibt es zwei Hauptvarianten:

  1. PCRE (Perl Compatible Regular Expressions)preg_* Funktionen
  2. POSIX Extended (veraltet seit PHP 5.3) – ereg_* Funktionen

Wir konzentrieren uns auf PCRE, da es leistungsfähiger und moderner ist.

Einfaches Beispiel:

$text = "Das Meeting findet am 15.07.2023 statt.";
if (preg_match('/\d{2}\.\d{2}\.\d{4}/', $text, $matches)) {
    echo "Datum gefunden: " . $matches[0];
}
// Ausgabe: Datum gefunden: 15.07.2023

Grundbausteine von RegEx

Literale Zeichen

Direkte Übereinstimmungen mit normalen Zeichen:

preg_match('/haus/', 'ein haus am see'); // findet "haus"

Metazeichen (Spezialzeichen)

Diese Zeichen haben besondere Bedeutung:

ZeichenBedeutungBeispiel
.Beliebiges Zeichen (außer Zeilenumbruch)/h.aus/ findet „haus“, „hxaus“
^Anfang des Strings/^h/ findet „h“ nur am Anfang
$Ende des Strings/s$/ findet „s“ nur am Ende
\dZiffer (0-9)/\d/ findet „1“ in „a1“
\wWortzeichen (Buchstabe, Ziffer, _)/\w+/ findet „Hallo123“
\sLeerzeichen (Space, Tab, etc.)/\s/ findet Leerzeichen

Quantifizierer (Wie oft?)

Steuern, wie oft ein Muster vorkommen soll:

QuantifiziererBedeutungBeispiel
*0 oder mehr/ho*se/ findet „hse“, „hose“, „hooose“
+1 oder mehr/ho+se/ findet „hose“, nicht „hse“
?0 oder 1/ho?se/ findet „hse“ oder „hose“
{n}Genau n-mal/\d{4}/ findet 4-stellige Zahlen
{n,}Mindestens n-mal/\d{2,}/ findet Zahlen mit ≥2 Ziffern
{n,m}Zwischen n und m-mal/\d{2,4}/ findet 2-4 Ziffern

Zeichenklassen

Ermöglichen die Suche nach bestimmten Zeichengruppen:

// Findet Vokale
preg_match('/[aeiou]/', 'Hallo'); // Trifft auf "a" und "o"

// Mit Bereichsangabe:
preg_match('/[a-z]/', '123abc'); // Trifft auf "a"

// Negierte Klasse (alles außer...):
preg_match('/[^0-9]/', '123a'); // Trifft auf "a"

Wichtige PCRE-Funktionen in PHP

preg_match() – Einfache Suche

Findet das erste Vorkommen eines Musters:

$text = "Die Telefonnummer ist 0123-4567890";
if (preg_match('/\d{4}-\d{6}/', $text, $matches)) {
    echo "Telefonnummer: " . $matches[0];
}
// Ausgabe: Telefonnummer: 0123-4567890

preg_match_all() – Alle Treffer finden

Findet alle Vorkommen:

$text = "Preise: 10€, 20€, 30€";
preg_match_all('/\d+€/', $text, $matches);
print_r($matches[0]);
// Ausgabe: Array ([0] => 10€ [1] => 20€ [2] => 30€)

preg_replace() – Suchen und Ersetzen

Ersetzt Treffer durch neuen Text:

$text = "Heute ist 2023-07-15";
$neu = preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$3.$2.$1', $text);
echo $neu; // Ausgabe: Heute ist 15.07.2023

preg_split() – Anhand eines Musters teilen

Wie explode(), aber mit RegEx:

$text = "Apfel,Birne;Kirsche Orange";
$teile = preg_split('/[,; ]+/', $text);
print_r($teile);
// Ausgabe: Array ([0] => Apfel [1] => Birne [2] => Kirsche [3] => Orange)

Häufige Anwendungsfälle mit Beispielen

E-Mail-Validierung

function istEmail($email) {
    return preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email);
}
echo istEmail('test@example.com') ? "Gültig" : "Ungültig";

Passwort-Stärke prüfen

function istStarkesPasswort($passwort) {
    // Mind. 8 Zeichen, Groß-/Kleinbuchstaben, Zahl, Sonderzeichen
    return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$/', $passwort);
}

HTML-Tags entfernen

$text = "<p>Hallo <b>Welt</b></p>";
$clean = preg_replace('/<[^>]*>/', '', $text);
echo $clean; // Ausgabe: Hallo Welt

URLs extrahieren

$text = "Besuche https://example.com oder http://test.de";
preg_match_all('/https?:\/\/[^\s]+/', $text, $matches);
print_r($matches[0]);

Fortgeschrittene Konzepte

Gruppierung mit ()

Gruppierungen erlauben das Extrahieren von Teilen:

$text = "Datum: 15-07-2023";
preg_match('/(\d{2})-(\d{2})-(\d{4})/', $text, $matches);
echo "Tag: " . $matches[1]; // 15
echo "Monat: " . $matches[2]; // 07
echo "Jahr: " . $matches[3]; // 2023

Nicht erfassende Gruppen (?:)

Gruppieren ohne Speichern:

preg_match('/(?:\d{2})-(\d{2})-(\d{4})/', '15-07-2023', $matches);
// $matches[1] ist jetzt "07" (früher [2])

Lookaheads/Lookbehinds

Bedingungen für vor/nach dem Muster:

// Findet "q" gefolgt von "u", ohne "u" zu matchen
preg_match('/q(?=u)/', 'quark'); // Trifft auf "q"

// Findet "q" nicht gefolgt von "u"
preg_match('/q(?!u)/', 'qatar'); // Trifft auf "q"

Performance-Tipps

Komplizierte Muster vorberechnen:

$pattern = '/\d{4}-\d{2}-\d{2}/';
// Wiederverwenden statt bei jedem Aufruf neu zu kompilieren

Greedy vs. Lazy Quantifizierer:

• Standardmäßig sind Quantifizierer „greedy“ (fressen so viel wie möglich)
• Mit ? macht man sie „lazy“ (so wenig wie möglich)

preg_match('/<.*>/', '<div>test</div>', $matches); // Greedy: "<div>test</div>"
preg_match('/<.*?>/', '<div>test</div>', $matches); // Lazy: "<div>"

Debugging von RegEx

RegEx kann schnell komplex werden. Hilfreiche Tools:
Online Tester: regex101.com, regexr.com
Visualisierer: debuggex.com
PHP-Funktion: preg_last_error() nach fehlgeschlagenen Aufrufen

Metaphern zum besseren Verständnis

01. RegEx ist wie ein Schlüssel – Nur wenn das Profil (Muster) genau zum Schloss (Text) passt, öffnet es sich.
02. Quantifizierer sind wie Mengenangaben beim Kochen – „1 oder 2 Eier“ ({1,2}), „eine Prise Salz“ (? für optional).
03. Zeichenklassen sind wie Gästeausweise – „[A-Z]“ ist wie „Nur Personen mit Großbuchstabenausweis dürfen eintreten“.
04. Lookaheads sind wie Türsteher – Sie prüfen, ob die richtigen Leute in der Schlange stehen, ohne sie einzulassen.

Schweizer Taschenmesser

Reguläre Ausdrücke sind wie ein Schweizer Taschenmesser für Textverarbeitung – anfangs vielleicht einschüchternd, aber unglaublich nützlich, sobald man sie beherrscht.

Dieses Dokument teilen

Regular Expressions &

Oder Link kopieren

INHALT

Abonnieren

×
Cancel