![]() |
RegExpression Hilfe - E-Mail prüfen
Hallo,
von BenBe habe ich eine funktionierende Maske für RegExp gefunden: ![]()
Code:
Leider weiß ich nicht, wie ich diese umbauen kann, damit auch (seit längerer Zeit existierende) 1-stellige Domains oder Umlaut-Domains mit erfasst werden.
[\w\d][\w\d\-]+@((\w[\w\d\-]*[\w\d]\.)+\w{2,3}|\d{1,9}|\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})
Mir wäre sehr geholfen, wenn ich erklärt bekäme, wo in dem Code steht, dass test@12.de gültig, aber test@1.de ungültig ist. LG Mathias :-) Nach Tests auf ![]() [\w\d][\w\d\-]+@((\w[\w\d\-]*[\w\d]\.)+\w{2,3}|\d{1,9}|\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3 }) Die Länge hat sich somit erledigt. Aber wie kann ich jetzt noch Umlautdomains zulassen? Ist dies hier korrekt?
Code:
[\w\d\_äÄöÖüÜß-]+@(([\w\d\_äÄöÖüÜß-]*[\w\d]\.)+\w{2,3}|\d{1,9}|\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})
|
AW: RegExpression Hilfe - E-Mail prüfen
|
AW: RegExpression Hilfe - E-Mail prüfen
Hallo himitsu.
danke für die Links. Die Prüfung auf ein @ in der E-Mail-Adresse erscheint mir, trotz des letzten Links, dennoch zu profan. Der zweite Link deckt keine Umlaute ab. Es gibt die Domains ö.de, ü.de und ü.de Hier könnten (theoretisch) auch E-Mails empfangen werden. Mit der modifizierten RegExp, von BenBe, komme ich gut klar. Hab vielen Dank und eine schöne Woche :-) LG Mathias |
AW: RegExpression Hilfe - E-Mail prüfen
In der Domain sind niemals umlaute ... in der URL ist es codiert
flüge.de xn--flge-1ra.de abcöäüßŵðë不用谢.de xn--abc-7kay7b8a7b3c03fu452cmcxd0owc.de Allerdings gilt das ACE nur für die Domain. Der Name vor dem @ und alles hinter der Domain (also ab .de und der Pfad, Dateiname und die ?Parameter und der #Anker) haben jeweils eigene/andere Codierungen. |
AW: RegExpression Hilfe - E-Mail prüfen
Ach, warum ist das immer alles so kompliziert..
Dann nehme ich die Umlaute wieder raus, bis ich Lust habe, diese Kodierung einzubauen. Ich danke Dir herzlich! LG |
AW: RegExpression Hilfe - E-Mail prüfen
Aus
![]() Zitat:
Der reguläre Ausdruck wird nur bei der Eingabe z.B. in einem Edit-Feld verwendet. Bei der Erstellung der Mail muss diese noch gemäß den Standards kodiert werden, aber dass ist Aufgabe der E-Mail-Komponente, und für den Anwender der die Mail-Adresse eingibt, "unsichtbar". Nachtrag: obiger Ausdruck unterstützt auch die "neuen" Domänen mit nur 2 oder mehr als 3 Zeichen, durch den Ausdruck "{2,}" Code für die Domänen-Kodierung: ![]() |
AW: RegExpression Hilfe - E-Mail prüfen
Ich werfe mal
![]() |
AW: RegExpression Hilfe - E-Mail prüfen
Zitat:
Delphi-Quellcode:
Bitte beachte, das Umlaute nur in der Domäne gültig sind und die Adresse davor keine Umlaute enthalten darf.
punycode_email := RF_PunyEncodeMailAddr('Joerg.Mueller@müller.de');
if not RF_ValidEMail(punycode_email) then raise Exception.Create('E-Mail ungültig');
Delphi-Quellcode:
// Punycode Konvertierung
// // Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA) // http://www.rfc-editor.org/rfc/rfc3492.txt // // Delphi-Unit von Daniel Mitte (2005) // Original-Code von http://www.activevb.de // // Beispiel: // pc := TPunyClass.Create; // e := pc.Encode('müller'); // Verschlüsselt 'müller' zu 'mller-kva' // d := pc.Decode(e); // Entschlüsselt 'mller-kva' zu 'müller' // pc.Free; type TPunyClass = class private function GetMinCodePoint(const n: Longint; const data: WideString): Longint; function IsBasic(c: WideString; const n: Longint): Boolean; function Adapt(const delta, numpoints: Longint; const firsttime: Boolean): Longint; function Digit2Codepoint(const d: Longint): Longint; function Codepoint2Digit(const c: Longint): Longint; function UInt(i: Longint): Longint; function Asc(s: WideString): Longint; function AscW(s: WideString): Longint; function PosRev(sub, text: WideString): Longint; public function Encode(const input: WideString): WideString; function Decode(const input: WideString): WideString; end; type TMyArrayOfString = array of string; procedure GTL_StringExplode(var a: TMyArrayOfString; const Border, S: string); var aStr: string; anIdx: Integer; aPos: integer; begin anIdx := 0; aStr := S + Border; repeat SetLength(a, anIdx+1); aPos := Pos(Border, aStr); a[anIdx] := Copy(aStr, 0, aPos - 1); Delete(aStr, 1, Length(a[anIdx] + Border)); Inc(anIdx); until aStr = ''; end; function RF_PunyEncodeMailAddr(const AEMail: string): string; var aStrings: TMyArrayOfString; aPunyStr: string; anIdx: integer; begin Result := ''; anIdx := Pos('@', AEMail); Result := Copy(AEMail, 1, anIdx-1); if anIdx > 0 then Result := Result +'@'; aPunyStr := Copy(AEMail, anIdx+1, 255); GTL_StringExplode(aStrings, '.', aPunyStr); with TPunyClass.Create do try for anIdx := Low(aStrings) to High(aStrings) do begin aPunyStr := Encode(aStrings[anIdx]); if aPunyStr <> aStrings[anIdx] then aPunyStr := 'xn--' + aPunyStr; if anIdx > Low(aStrings) then aPunyStr := '.' + aPunyStr; Result := Result + aPunyStr; end; finally Free; end; end; const BASE: Longint = 36; TMIN: Longint = 1; TMAX: Longint = 26; SKEW: Longint = 38; DAMP: Longint = 700; INITIAL_BIAS: Longint = 72; INITIAL_N: Longint = 128; Delimiter: WideString = '-'; MAX_INT: Longint = 2147483647; function TPunyClass.Encode(const input: WideString): WideString; var n, delta, bias, b, l, h, q, m, k, t: Longint; text, output, c: WideString; first: Boolean; begin text := input; output := ''; try n := INITIAL_N; bias := INITIAL_BIAS; b := 0; for l := 1 to Length(text) do begin c := Copy(text, l, 1); if IsBasic(c, INITIAL_N) = True then begin output := output + c; b := b + 1; end; end; if Length(output) < Length(text) then if Length(output) > 0 then output := output + Delimiter; h := b; delta := 0; while h < Length(text) do begin m := GetMinCodePoint(n, text); delta := delta + UInt(m - n) * (h + 1); n := m; for l := 1 to Length(text) do begin c := Copy(text, l, 1); if IsBasic(c, n) = True then delta := delta + 1 else if UInt(AscW(c)) = n then begin q := delta; k := BASE; while k <= MAX_INT do begin if k <= (bias + TMIN) then t := TMIN else if k >= (bias + TMAX) then t := TMAX else t := k - bias; if q < t then break; output := output + Chr(Digit2Codepoint(t + ((q - t) Mod (BASE - t)))); q := (q - t) div (BASE - t); k := k + BASE; end; output := output + Chr(Digit2Codepoint(q)); first := False; if h = b then first := True; bias := Adapt(delta, h + 1, first); delta := 0; h := h + 1; end; end; delta := delta + 1; n := n + 1; end; except output := input; end; Result := output; end; function TPunyClass.Decode(const input: WideString): WideString; var n, i, bias, l, ps, oldi, w, k, t: Longint; digit: Byte; text, output, c: WideString; first: Boolean; begin text := input; output := ''; try n := INITIAL_N; bias := INITIAL_BIAS; i := 0; ps := PosRev(Delimiter, text); if ps > 0 then begin for l := 1 to (ps - 1) do begin c := Copy(text, l, 1); if IsBasic(c, INITIAL_N) = True then output := output + c else begin Result := ''; Exit; end; end; end; ps := ps + 1; while ps <= Length(text) do begin oldi := i; w := 1; k := BASE; while ((k <= MAX_INT) and (ps <= Length(text))) do begin c := Copy(text, ps, 1); ps := ps + 1; digit := Codepoint2Digit(Asc(c)); if ((digit >= BASE) or (digit > ((MAX_INT - i) / w))) then begin Result := ''; Exit; end; i := i + digit * w; if k <= bias then t := TMIN else if k >= (bias + TMAX) then t := TMAX else t := k - bias; if digit < t then break; if w > (maxint / (base - t)) then begin Result := ''; Exit; end; w := w * (BASE - t); k := k + BASE; end; first := False; if oldi = 0 then first := True; bias := Adapt(i - oldi, Length(output) + 1, first); if (i / (Length(output) + 1)) > (MAX_INT - n) then begin Result := ''; Exit; end; n := n + i div (Length(output) + 1); i := i mod (Length(output) + 1); if IsBasic(WideChar(n), INITIAL_N) = True then begin Result := ''; Exit; end; output := Copy(output, 1, i) + WideChar(n) + Copy(output, i + 1, Length(output) - (i + 1) + 1); i := i + 1; end; except output := input; end; Result := output; end; function TPunyClass.GetMinCodePoint(const n: Longint; const data: WideString): Longint; var t, a, res: Longint; begin res := 2147483647; for t := 1 to Length(data) do begin a := UInt(AscW(Copy(data, t, 1))); if ((a >= n) and (a < res)) then res := a; end; Result := res; end; function TPunyClass.IsBasic(c: WideString; const n: Longint): Boolean; begin Result := False; if UInt(AscW(c)) < n then Result := True; end; function TPunyClass.Adapt(const delta, numpoints: Longint; const firsttime: Boolean): Longint; var k, dt: Longint; begin dt := delta; if firsttime = True then dt := dt div DAMP else dt := dt div 2; dt := dt + (dt div numpoints); k := 0; while dt > (((BASE - TMIN) * TMAX) div 2) do begin dt := dt div (BASE - TMIN); k := k + BASE; end; Result := k + (((BASE - TMIN + 1) * dt) div (dt + SKEW)); end; function TPunyClass.Digit2Codepoint(const d: Longint): Longint; begin Result := 0; if d < 26 then Result := d + 97 else if d < 36 then Result := d - 26 + 48; end; function TPunyClass.Codepoint2Digit(const c: Longint): Longint; begin Result := BASE; if (c - 48) < 10 then Result := c - 22 else if (c - 65) < 26 then Result := c - 65 else if (c - 97) < 26 then Result := c - 97; end; function TPunyClass.UInt(i: Longint): Longint; begin Result := i; if i < 0 then Result := 65536 + i; end; function TPunyClass.Asc(s: WideString): Longint; var c: WideChar; begin Result := 0; if Length(s) > 0 then begin c := s[1]; Result := Word(c); end; end; function TPunyClass.AscW(s: WideString): Longint; var c: WideChar; begin Result := 0; if Length(s) > 0 then begin c := s[1]; Result := Longint(c); end; end; function TPunyClass.PosRev(sub, text: WideString): Longint; var p: Longint; s: WideString; begin Result := 0; s := ''; for p := 1 to Length(text) do s := s + Copy(text, Length(text) - p + 1, 1); p := Pos(sub, s); if p > 0 then Result := Length(s) - p + 1; end; // End of Punny Code /////////////////////////////////// function RF_ValidEMail(AEMail: string): Boolean; // Returns True if the email address is valid for RFC 2822 // Author: Ernesto D'Spirito / modified R.Frei const // Valid characters in an "atom" atom_chars = ['A'..'Z', 'a'..'z', '0'..'9', '!', '#', '$', '%', '&', '''', '*', '+', '-', '/', '=', '?', '^', '_', '`', '(', '|', ')', '~']; // Valid characters in a "quoted-string" quoted_string_chars = [#0..#255] - ['"', #13, '\']; // Valid characters in a subdomain letters = ['A'..'Z', 'a'..'z']; letters_digits = ['0'..'9', 'A'..'Z', 'a'..'z']; subdomain_chars = ['-', '0'..'9', 'A'..'Z', 'a'..'z']; type States = (STATE_BEGIN, STATE_ATOM, STATE_QTEXT, STATE_QCHAR, STATE_QUOTE, STATE_LOCAL_PERIOD, STATE_EXPECTING_SUBDOMAIN, STATE_SUBDOMAIN, STATE_HYPHEN); var State: States; i, n, subdomains, LastSubDomSep: Integer; c: Char; begin AEMail := RF_PunyEncodeMailAddr(AEMail); State := STATE_BEGIN; n := Length(AEMail); i := 1; LastSubDomSep := 0; subdomains := 1; while (i <= n) do begin c := AEMail[i]; case State of STATE_BEGIN: if CharInSet(c, atom_chars) then State := STATE_ATOM else if c = '"' then State := STATE_QTEXT else break; STATE_ATOM: if c = '@' then State := STATE_EXPECTING_SUBDOMAIN else if c = '.' then State := STATE_LOCAL_PERIOD else if not CharInSet(c, atom_chars) then break; STATE_QTEXT: if c = '\' then State := STATE_QCHAR else if c = '"' then State := STATE_QUOTE else if not CharInSet(c, quoted_string_chars) then break; STATE_QCHAR: State := STATE_QTEXT; STATE_QUOTE: if c = '@' then State := STATE_EXPECTING_SUBDOMAIN else if c = '.' then State := STATE_LOCAL_PERIOD else break; STATE_LOCAL_PERIOD: if CharInSet(c, atom_chars) then State := STATE_ATOM else if c = '"' then State := STATE_QTEXT else break; STATE_EXPECTING_SUBDOMAIN: if CharInSet(c, letters_digits) then // rf. Orignal nur letters. 8488.ch wäre aber dann falsch?! State := STATE_SUBDOMAIN else break; STATE_SUBDOMAIN: if c = '.' then begin Inc(subdomains); LastSubDomSep := i; State := STATE_EXPECTING_SUBDOMAIN end else if c = '-' then State := STATE_HYPHEN else if not CharInSet(c, letters_digits) then break; STATE_HYPHEN: if CharInSet(c, letters_digits) then State := STATE_SUBDOMAIN else if c <> '-' then break; end; Inc(i); end; if i <= n then Result := False else Result := (State = STATE_SUBDOMAIN) and (subdomains >= 2) and (n - LastSubDomSep >= 2); end; |
AW: RegExpression Hilfe - E-Mail prüfen
Zitat:
![]() ![]() |
AW: RegExpression Hilfe - E-Mail prüfen
Liste der Anhänge anzeigen (Anzahl: 1)
Ich liebe das immer wenn Masken meine gültige Email-Adresse (enthält ein Plus-Zeichen) ablehnen weil jemand das irgendwie vorab "prüfen" musste.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz