Navigation
 Startseite
 Fachbücher
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Partner
 Sprüche Treff

Artfiles.de
Bietet Serviceorientierte Internetdienstleistungen...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains und...
https://www.Hosterplus.de
 
 
 

Host mit PHP preg_match() prüfen

Sie befinden sich: Home > Php Tutorial > Host mit preg_match() prüfe...

Host mit preg_match() prüfen


Eintrag am:  25.12.2009
Hits / Besucher:  5624
Sprache:  Deutsch
Kategorie:  Einsteiger Tutorials...
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

In diesem Tutorial Versuche ich ihnen zu erklären wie sie mit der PHP Funktion preg_match() eine Variable überprüfen anhand eines Suchmusters.

Flat-Illustration: Laptop mit gelbem Code-Fenster, darin die PHP-Funktion preg_match(); daneben ein Regex-Flow-Diagramm und ein rotes Schweizer Taschenmesser – symbolisiert, dass reguläre Ausdrücke das vielseitige Werkzeug der Textverarbeitung in PHP sind.

Reguläre Ausdrücke sind das Schweizer Taschenmesser der Textverarbeitung und ermöglichen die Anwendung komplexer patterns. Mit einem einzigen, kompakt notierten Muster kann man prüfen, ob eine Zeichenkette bestimmten Regeln folgt, Teile aus ihr herausfiltern oder vorhandene Werte validieren. In PHP übernimmt die Funktion preg_match() diese Aufgabe, indem sie – vereinfacht gesagt – fragt: „Passt diese Zeichenkette zu diesem Muster?“

Warum sollte man dafür nicht einfach strpos() oder seit PHP 8 str_contains() verwenden? Weil jene Funktionen nur feststellen, ob ein ganz bestimmter Sub-String vorkommt. preg_match() ist deutlich flexibler: Es versteht Platzhalter, Alternativen, Mengenangaben und sogar benannte Gruppen. Kurzum: Sobald Ihre Bedingung mehr ist als eine reine 1-zu-1-Suche, ist ein regulärer Ausdruck in preg_match() das Mittel der Wahl.

Eine häufige Frage lautet außerdem: Wann reicht preg_match() und wann brauche ich preg_match_all()? Die Antwort ist einfach:

  • preg_match() genügt, wenn Sie nur wissen möchten, ob mindestens ein Treffer existiert, oder wenn Sie nur den ersten Treffer (und ggf. dessen Gruppen) benötigen.

  • preg_match_all() ist unverzichtbar, wenn Sie alle Vorkommen im Text extrahieren wollen.

1. Die Syntax von preg_match() verstehen

int preg_match(

string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
)
Parameter Bedeutung Hinweise
$pattern Der reguläre Ausdruck, umschlossen von Delimitern (/.../). Delimiter frei wählbar (/#~ …), Modifikatoren wie imu hinter dem letzten Delimiter.
$subject Die zu prüfende Zeichenkette. Beliebiger String, auch Binärdaten möglich.
$matches -9967-980a8a432853">Ergebnis‐Array (per Referenz). Enthält kompletten Treffer [0], danach Gruppen [1][2] …; bei benannten Gruppen zusätzlich assoziative Keys.
$flags Verhalten steuern. PREG_OFFSET_CAPTUREPREG_UNMATCHED_AS_NULL u. a.
$offset Startposition (in Byte‐Offsets). Nützlich bei wiederholter Suche im selben String.

Der Rückgabewert ist 1 bei mindestens einem Treffer, 0 bei keinem Treffer und false bei einem Syntax-Fehler im Muster. Prüfen Sie deshalb immer strikt mit ===, was bei der Verwendung von regular expressions von Bedeutung ist. – sonst verwechseln Sie leicht „kein Treffer“ mit „Fehler“.

if (preg_match($pattern, $subject) === 1) {

// Treffer!
}

Fehlerdetails liefert preg_last_error() bzw. ab PHP 8.0 preg_last_error_msg().

2. Regex-Grundlagen in PHP

Bevor wir tief in Code-Beispiele eintauchen, werfen wir einen Kurzblick auf die wichtigsten Bausteine regulärer Ausdrücke:
 
Kategorie Symbol(e) Bedeutung
Start/Ende ^$ Anfang bzw. Ende der gesamten Zeichenkette
Wildcard . Beliebiges Zeichen außer Zeilenumbruch
Zeichenklassen [abc][^abc]dws … „Ein Zeichen aus …“ (inkl. Negation, Ziffern, Wortzeichen, Leerraum etc.)
Quantifizierer *+?{n}{n,}{n,m} Gibt an, wie oft das vorherige Element vorkommen darf/muss
Gruppierung ( … ) Fasst mehrere Elemente zusammen, speichert zugleich die Treffer
Alternativen A | B Entweder A oder B
Benannte Gruppen (?<name> … ) Erhöht Lesbarkeit, Rückgriff über $matches['name'] möglich
Modifier imsux Verändern das Verhalten des Musters (z. B. Case-Insensitive, Dot-All)

Greedy vs. Lazy
*+{n,} sind standardmäßig „gierig“ und greifen sich so viel wie möglich. Hängen Sie ein ? an, werden sie „sparsam“ (lazy). Beispiel: .*? – das kleinste mögliche Stück bis zum nächsten passenden Zeichen.

Unicode
Damit ä oder Emoji richtig als ein Codepoint erkannt werden, setzen Sie den u-Modifier: '/w+/u'. Sonst arbeitet PHP intern bytebasiert.

3. Rückgabewert richtig interpretieren

$result = preg_match($pattern, $subject, $matches, 0, $offset);

if ($result === false) {
// Syntax-Fehler: echo preg_last_error_msg();
} elseif ($result === 0) {
// kein Treffer
} else {
// mindestens ein Treffer – $matches ist gefüllt
}

Der häufigste Stolperstein: preg_match() kann 0 zurückgeben, wenn kein Treffer existiert. Wer nur mit if ($result) prüft, hält das fälschlich für einen Fehler – vermeiden Sie das mit ===.

4. Praxisnahe Beispiele mit regulären Ausdrücken

Bevor wir konkrete Anwendungsfälle durchgehen, folgen nun praxisnahe Beispiele, die zeigen, wie reguläre Ausdrücke in typischen Szenarien eingesetzt werden – von einfachen Prüfungen bis zu komplexeren Mustern.

4.1 E-Mail-Validierung (light)

$pattern = '/^[w.+-]+@([w-]+.)+[A-Za-z]{2,}$/D';

(Hinweis: Eine RFC-konforme Prüfung ist weitaus komplexer; für einfache Formulare genügt diese Variante und alternativ können Sie auch einen Validierungsfilter verwenden.)

4.2 Nur numerische Zeichenkette von 4–6 Ziffern

$pattern = '/^d{4,6}$/';

Nützlich etwa für TAN-Codes oder PINs.

4.3 Daten extrahieren: Name & Alter

$subject = 'Name: Alice Mustermann, Alter: 29';

$pattern = '/Name:s*(?<name>[pL ]+),s*Alter:s*(?<age>d+)/u';

preg_match($pattern, $subject, $m);
echo $m['name']; // Alice Mustermann
echo $m['age']; // 29

Dank benannter Gruppen (?<name>) ist das Ergebnis selbstdokumentierend.

4.4 Positionsangaben mit PREG_OFFSET_CAPTURE

$pattern = '/bd{5}b/';

$subject = 'PLZ 10115 Berlin, PLZ 80331 München';

preg_match($pattern, $subject, $m, PREG_OFFSET_CAPTURE);
printf("Erster Treffer: %s @ Byte-Pos %dn", $m[0][0], $m[0][1]);
// → 10115 @ 4

Die zweite Dimension speichert den Byte-Offset des jeweiligen Treffers.

4.5 Optionale Gruppen & PREG_UNMATCHED_AS_NULL

$pattern = '/^(?<user>[^:]+)(?::(?<pass>.*))?$/';

$subject = 'user42:secret';

preg_match($pattern, $subject, $m, PREG_UNMATCHED_AS_NULL);
var_dump($m);
/*
array(3) {
["user"]=> string(6) "user42"
["pass"]=> string(6) "secret"
[0] => string(13) "user42:secret"
}
*/

Ohne Flag bekäme man statt NULL einen leeren String, was die Logik verkomplizieren kann.

4.6 Suche ab bestimmtem Offset

$pattern = '/bw+b/';

$subject = 'One two three';
preg_match($pattern, $subject, $m, 0, 4); // ab Byte 4 → "two"

5. Das $matches-Array im Detail

Situation $matches Inhalt
Keine Gruppen Index 0 enthält den kompletten Treffer
Nummerierte Gruppen 0 = Gesamttreffer, 12, … = Inhalte der Gruppen gemäß Klammer-Reihenfolge
Benannte Gruppen Zusätzlich zu den numerischen Indizes: assoziative Keys wie 'name''age' etc.
PREG_OFFSET_CAPTURE Jeder Treffer ist ein Array [Wert, Offset], wobei Offset die Startposition ist
PREG_UNMATCHED_AS_NULL Nicht getroffene optionale Gruppen werden mit NULL belegt statt mit leeren Strings

Ein häufiger Fehler ist der Versuch, optional nicht vorhandene Gruppen direkt zu nutzen, ohne zu prüfen, ob sie existieren. Setzen Sie hier auf das Flag oder isset().

6. Häufige Fallstricke & Best Practices

  1. Greedy Quantifier
    .* schnappt sich oft zu viel. Anhängen von ? oder präzisere Muster lösen das Problem.

  2. Delimiter escapen
    Wenn Ihr Muster / enthält, wählen Sie zum Beispiel # als Delimiter oder escapen Sie mit /. Nutzen Sie notfalls preg_quote() um Fremd-Strings sicher einzubetten, indem Sie ein passendes pattern verwenden.

  3. Performance
    Reguläre Ausdrücke mit vielen verschachtelten Quantifizierern ((.*)+) können Exponential-Backtracking verursachen. Für reine „Substring vorhanden?“-Checks ist str_contains() (ab PHP 8) dramatisch schneller.

  4. Unicode
    Vergessen Sie nie den u-Modifier, wenn Ihre Texte Umlaute, Emojis etc. enthalten. Sonst bricht w schon bei ä.

  5. HTML-Parsing
    „HTML mit Regex parsen“ gilt klassisch als No-Go. Nutzen Sie stattdessen DOMDocument, das auch mit character Daten umgehen kannDOMXPath oder spezialisierten Parser wie simplehtmldom.

  6. Sicherheit (ReDoS)
    Lassen Sie nie nutzergenerierte Muster ungeprüft auf Ihren Server los. Ein geschickt gebauter Regex kann CPU-Zeit bis zum Timeout fressen.

  7. Lesbarkeit
    Aktivieren Sie den x-Modifier (/.../x) und fügen Sie Whitespace + Kommentare (?# ... ) hinzu. Ihre Kollegen danken es Ihnen – oder Sie selbst in sechs Monaten.

7. preg_match() vs. preg_match_all() vs. String-Funktionen

Aufgabe Beste Funktion Warum?
Existenz eines Musters prüfen preg_match() Erster Fund genügt, schneller als preg_match_all().
Alle Vorkommen extrahieren preg_match_all() Liefert mehrdimensionale Trefferliste.
Einfaches Teil-String-Vorkommen str_contains() / strpos() Kein Regex-Overhead.
Text nach fixer Trennsequenz teilen explode() / str_split() Intuitiver, performanter.

8. Komplettes, kommentiertes Beispiel-Skript

Diese Beispiel prüft, ob eine eingegebene Zeichenkette ein gültiger DNS-Hostname ist.

<?php

/**
* (c) 2025 by Nico Schubert
* Prüft, ob eine Host-Zeichenkette ein valider DNS-Name ist.
*/

declare(strict_types=1);

$host = $argv[1] ?? 'www.beispiel.de';

// Muster: Subdomains + TLD (2–63 Zeichen), ausschließlich Buchstaben, Ziffern, Bindestrich
$pattern = <<<'REGEX'
/^(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?.)+(?:[A-Z]{2,63})$/iuD
REGEX;

if (($res = preg_match($pattern, $host, $m)) === 1) {
echo "$host ist ein gültiger Hostnamen";
// ggf. hier fsockopen() → Port 80/443
} elseif ($res === 0) {
echo "$host ist KEIN gültiger Hostnamen";
} else {
fprintf(STDERR, "Regex-Fehler: %sn", preg_last_error_msg());
exit(1);
}

In den Beispiel wird ein regulärer Ausdruck verwendet, der die Regeln für Domainnamen gemäß RFC (z. B. RFC 1035) beachtet:

  • Der Hostname muss aus Subdomains bestehen, die durch Punkte getrennt sind (z. B. www.example.com).
  • Jede Subdomain beginnt und endet mit einem Buchstaben oder einer Ziffer, dazwischen sind auch Bindestriche erlaubt.
  • Die Top-Level-Domain (TLD) am Ende besteht nur aus Buchstaben und ist zwischen 2 und 63 Zeichen lang.
  • Es wird zwischen Groß- und Kleinschreibung nicht unterschieden.

Das Skript nimmt den zu prüfenden Hostnamen aus $argv[1] (Kommandozeilenargument) oder verwendet www.beispiel.de als Standardwert. Der Rückgabewert von preg_match() wird geprüft:

  • 1: gültiger Hostname
  • 0: ungültiger Hostname
  • false: Regex-Fehler, wird mit Fehlermeldung abgebrochen

Optional könnte man im Erfolgsfall z. B. mit fsockopen() weiter testen, ob der Host erreichbar ist (Port 80 oder 443).

9. Fazit

preg_match() ist eine der mächtigsten, aber auch am häufigsten missverstandenen Funktionen in PHP. Wer ihre Rückgabewerte nicht exakt unterscheidet oder ohne Unicode-Modifier arbeitet, tappt schnell in Fehlerfallen. Mit den hier gezeigten Best Practices, dem Überblick über Flags und den vielen Beispiel-Snippets sollte Ihnen jedoch jeder typische Anwendungsfall gelingen – von der simplen Existenzprüfung bis zur ausgeklügelten Datenextraktion mit benannten Gruppen und Byte-Offsets.

Nutzen Sie reguläre Ausdrücke, wo sie wirklich einen Mehrwert bieten, und greifen Sie auf String-Funktionen zurück, wenn ein schnelles „kommt vor?“ genügt. So kombinieren Sie Performance, Wartbarkeit und Funktionsumfang optimal.

Tipp zum Weiterlernen: Experimentieren Sie mit Online-Tools wie regex101.com – dort können Sie PHP-kompatible Muster testen, sich den Backtracking-Graphen anzeigen lassen und jedes Stück des Ausdrucks interaktiv erläutern. Sobald Sie Ihr Muster verstanden haben, überführen Sie es 1-zu-1 in Ihr preg_match()-Skript und profitieren Sie von präzise validierten Eingaben.

 

Tags:

 

Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.