Regex zur Validierung von E-Mail, URL und Telefonnummern
Validierungs-Regex wird häufiger kopiert als jede andere Art, und vieles davon ist subtil falsch. Hier sind Muster, die in echten Formularen funktionieren, was jeder Teil bewirkt und wann ein regulärer Ausdruck das falsche Werkzeug ist.
Lose validieren, echt verifizieren
Eine Regex kann dir nur sagen, dass eine Eingabe wie eine E-Mail-Adresse aussieht; erst der Versand einer Nachricht beweist, dass sie existiert. Strenge Muster weisen echte Nutzer ab – etwa mit Plus-Zeichen, langen Domains oder internationalen Namen – lassen aber Tippfehler durch. Ziel sind Muster, die offensichtliche Fehler abfangen, und danach eine echte Prüfung.
E-Mail-Adressen
Ein pragmatisches Muster, das fast jede echte Adresse trifft:
^[^\s@]+@[^\s@]+\.[^\s@]{2,}$
Etwas, ein @, eine Domain mit Punkt und keine Leerzeichen. Es akzeptiert ada+news@example.co.uk und lehnt ada@example sowie ada @example.com ab. Eine etwas strengere Variante für den lokalen Teil:
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
Diese lehnt internationalisierte Adressen ab (wie josé@example.com), also nimm besser das erste, wenn deine Nutzer weltweit sind. Im HTML validiert <input type="email"> bereits mit der eigenen Regel des Browsers. Um zu prüfen, ob eine Domain überhaupt Mails empfangen kann, schau den MX-Eintrag mit dem Email DNS Checker nach.
URLs
Schreib keine URL-Regex – parse die URL. Jede moderne Laufzeitumgebung hat einen URL-Parser, der die Regeln kennt:
function isHttpUrl(value) {
try {
const u = new URL(value);
return u.protocol === 'http:' || u.protocol === 'https:';
} catch {
return false;
}
}
Das Prüfen des Protokolls ist wichtig: new URL('javascript:alert(1)') wird fehlerfrei geparst, und dieser String darf niemals in einem href landen. Wenn du eine Regex brauchst, um URLs in Text zu finden, nimm etwas Einfaches und parse jeden Treffer anschließend:
https?:\/\/[^\s<>"']+
Zerlege eine URL mit dem URL Parser in Protokoll, Host, Pfad und Query-Parameter.
Telefonnummern
Telefonformate unterscheiden sich je nach Land, deshalb bereinigt die sicherste Regex nur die Eingabe. Entferne alles außer Ziffern und einem führenden Plus und prüfe dann die Länge nach E.164 (bis zu 15 Ziffern):
const clean = input.replace(/(?!^\+)[^\d]/g, '');
const ok = /^\+?[1-9]\d{6,14}$/.test(clean);
Für eine echte Prüfung nach Land – Vorwahlen, Mobil- vs. Festnetz – nutze eine Bibliothek wie libphonenumber. Ein Muster nur für Nordamerika, falls du ausschließlich das akzeptierst:
^\(?([2-9]\d{2})\)?[-.\s]?(\d{3})[-.\s]?(\d{4})$
Vor dem Einsatz testen
Füge ein Muster mit einer Liste gültiger und ungültiger Beispiele, eine Zeile pro Eintrag, in den Regex Tester ein und aktiviere das Multiline-Flag, damit ^ und $ jede Zeile treffen. Wenn ein geerbtes Muster unlesbar ist, zerlegt der Regex Explainer es Token für Token. Achte auf katastrophales Backtracking: verschachtelte Quantifizierer wie (a+)+ können einen Server bei einer gezielt gebauten Eingabe einfrieren.