Hejsa,
Jeg sidder og skal have valideret en email adresse via noget kode. Jeg har ikke nogle regular expression komponenter installeret, og har egentlig heller ikke den stor lyst til det, da behovet generelt ikke er til stede.
Jeg er på baggrund af noget VBS kode nået frem til følgende:
function ValidateEmail(const AAddress: String): Boolean;
const
ValidChars = ['a'..'z', '0'..'9', '_', '-', '.'];
var
AtPos : Integer;
DotPos : Integer;
Lng : Integer;
TmpAddr : String;
AName : String;
ADomain : String;
idx : integer;
Res : Boolean;
begin
Result := False;
Lng := Length(AAddress);
TmpAddr := LowerCase(AAddress);
AtPos := pos('@', TmpAddr);
DotPos := pos('.', Copy(TmpAddr, AtPos+1, Lng));
AName := Copy(TmpAddr, 1, AtPos-1);
ADomain := Copy(TmpAddr, AtPos+1, Lng);
Res := True;
for idx := 1 to length(AName) do
if not AName[idx] in ValidChars then
begin
Res := False;
break;
end;
if Res then
for idx := 1 to length(ADomain) do
if not ADomain[idx] in ValidChars then
begin
Res := False;
break;
end;
if Res then
Result := True
else
raise Exception.Create('Ugyldig email adresse.');
end;
Er der nogen kommentarer, eller ide til videre validering. Jeg vil ikke til at lave dns lookups og så videre på domænenavnet, men ellers er der noget som jeg har overset?
---
Thomas Due
Software developer
udvikleren.dk - ASP redaktør
tdue@mail.dk
Hej Thomas,
Det ser sådan set okay ud men den kan ikke håndtere f.eks: "thomas@udvikleren..dk" eller "thomas@udvikleren.co.uk.."
Så du kunne evt. sørge for at følgende ikke må kunne forkomme:
1) Der må ikke være 2 eller flere punktummer efter hinanden.
2) Den sidste karakter må værken være @, punktum, - eller _
3) ADomain variablen skal min være på 2 karakter.
4) AName skal minimum ha' en længde på 1.
5) Når du checker din AAddress i gennem skal det være bag fra (det er nemmere at implementere).
Jeg har lavet en ny funktion som checker bagfra (dog ikke testet) som du evt. kan bruge/bygge videre på.
function ValidateEmail(const AAddress: String): Boolean;
const
ValidChars = ['a'..'z', '0'..'9', '_', '-', '.'];
var
AtPos : Integer;
DotPos : Integer;
FirstDot: Integer;
Lng : Integer;
idx : integer;
TmpAddr : String;
begin
Result := False;
Lng := Length(AAddress);
TmpAddr := LowerCase(AAddress);
AtPos := 0;
DotPos := 0;
FirstDot := 0;
try
if Lng < 6 then // skal min. ha' x@x.xx
Exit;
for Idx := Lng downto 1 do
begin
if (TmpAddr[Idx] = '.') then
begin
if ((Idx = DotPos-1) or (Idx = Lng) or (Idx = AtPos-1)) then
Exit; // 2 '.' efter hinanden eller sidste karakter er '.' eller forgående var '@'
if (FirstDot = 0) then
FirstDot := Idx;
DotPos := Idx;
end
else
begin
if (TmpAddr[Idx] = '@') then
begin
if (Idx > DotPos-2) or (AtPos <> 0) then
Exit; // @ findes allerede eller det er inden for den sidste karakter før '.'
AtPos := Idx;
end
else
begin
if not (TmpAddr[idx] in ValidChars) then
Exit;
end;
end;
end;
Result := ((FirstDot > AtPos) and (AtPos > 1) and (FirstDot > 1));
finally
if not Result then // sørgfor altid at checke vores resultat
raise Exception.Create('Ugyldig email adresse.');
end;
end;
Mvh
Michael.