Autor |
Beitrag |
Olli_Sahr
      
Beiträge: 83
D5 Prof, D7 Architect
|
Verfasst: Mo 27.02.06 12:47
Hallo,
ich lasse in meiner Anwendung den Anwender unter anderem auch eine URL und eie Emailadresse eingeben.
Die will ich auf gültigkeit prüfen.
Ich könnte dazu die Emailadresse auf dieverse Krieterien überprüfen (Länge, genau einmal das Zeichen "@", mindestens einmal einen ".", vor dem @ mindestens zwei Zeichen, zwischen @ und letztem Punkt mindestens 2 Zeichen und nach dem letzten . bis zum Ende mindestens zwei Zeichen).
Dazu müsste ich mir selber eine Funktion machen (das ist nicht das Problem).
Gibt es da einen anderen Weg?
Eine übergreifende Funktion oder was einfacheres?
Kann man in einem MaskEdit die Emailadresse nicht formattiert eingeben lassen (und die URL auch), so dass man nichts falsches eingeben kann?
Wenn ja, wie müsste dann die EditMask dafür lauten?
Danke und Gruß
OLLI Moderiert von Tino: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 16.03.2006 um 10:50
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 27.02.06 14:17
Schau Dir mal die Komponente TRegExpr (Zusätzlich, FWS) an. Mit der kannst Du das relativ einfach machen:
EMail-Adressen:
Quelltext 1:
| /[a-zA-Z0-9]{2,}@(([a-zA-Z0-9]{2,}.)[a-zA-Z]{2,3}|\d{1,9}|\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})/i |
(Gültig sind dabei folgende Formate: user@host.tld, user@127.0.0.1, user@214796350 [IP als Langform])
Für URLs käme es jetzt drauf an, welche Du haben willst:
HTTP-URL (Mit und ohne Präfix):
Quelltext 1:
| /(http:\/\/)?(([a-zA-Z0-9]{2,}.)[a-zA-Z]{2,3}|\d{1,9}|\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})(/[a-zA-Z0-9%\(\)\[\]\{\}\.]+)+(/[a-zA-Z0-9%\(\)\[\]\{\}\.]*/ |
Für weitere Prüfmasken einfach fragen *g*
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Olli_Sahr 
      
Beiträge: 83
D5 Prof, D7 Architect
|
Verfasst: Mo 27.02.06 20:42
Hallo,
ich kann die Komponente nicht finden.
Habe Delphi 7 Architect und Delphi normal installiert.
Unter "Ansicht -> Komponentenliste" gebe ich den Namen ein, aber es wird nichts gefunden.
Auch im Delphi Verzeichnis habe ich alle Pascal Dateien nach dem Text durchsuchen lassen, nichts gefunden.
Kann es sein, dass in Delphi 7 die Kompo noch nicht dabei ist?
Gruß
OLLI
|
|
matze.de
      
Beiträge: 576
Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
|
Verfasst: Mo 27.02.06 21:26
Schau mal hier: regexpstudio.com/TRegExpr/TRegExpr.html
Komponente runterladen..installieren..benutzen
mfg matze
_________________ si tacuisses, philosophus mansisses.
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Fr 03.03.06 18:48
Theoretisch könntest du mit Copy(); den Teil hinter @ abschneiden und 'http://www.' davorsetzen.
Dann kannst du mit den Indy-Komponenten und idHTTP.Get(); überprüfen ob der Server antwortet.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
NetSpider
      
Beiträge: 123
Windows XP Pro
Delphi 7 Enterprise
|
Verfasst: Sa 04.03.06 11:00
Hallo Leute,
ich hab mal ein bisschen gegoogelt und hab einiges zu diesem Thema gefunden.
Ich konnte die 3 Varianten nicht testen, aber vielleicht klappts ja.
Diese Beispiele beziehen sich nur aufs Prüfen von gültigen E-Mail-Adressen!
Variante 1:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| function ValidEmail(const sValue: String): Boolean;
function CheckAllowed(const sTemp: String): Boolean; var iFor: Integer; begin Result := False; for iFor := 1 to Length(sTemp) do begin if not (sTemp[iFor] in ['a'..'z','A'..'Z','0'..'9','_','-','.']) then begin Exit; end; end; Result := True; end;
var iPos: integer; NamePart, ServerPart: string; begin Result := False; iPos := Pos('@', sValue); if (iPos = 0) or (Pos('..', sValue) > 0) then begin Exit; end; NamePart := Copy(sValue, 1, iPos - 1); ServerPart := Copy(sValue, iPos +1, Length(sValue)); if (Length(NamePart) = 0) or ((Length(ServerPart) < 4)) then begin Exit; end; iPos := Pos('.', ServerPart); if (iPos = 0) or (iPos >= (Length(ServerPart) - 1)) then begin Exit; end; Result := CheckAllowed(NamePart) and CheckAllowed(ServerPart); end; |
Der Aufruf für diese Funktion wäre dann:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button3Click(Sender: TObject); begin if ValidEMail('seti@home.de') then ShowMessage('Gut...') else ShowMessage('Nicht gut... :-p'); end; |
Variante 2:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| uses Masks;
function ValidEmail(const sValue: String): Boolean; begin Result := MatchesMask(sValue, '[A-Z0-9]*[A-Z0-9]@[A-Z0-9]*[A-Z0-9].[A-Z0-9]*');
end; |
und Variante 3:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| uses RegExpr;
function IsEMailValid(eMail: string): boolean; begin Result := ExecRegExpr('[\w\d\-\.]+@[\w\d\-]+(\.[\w\d\-]+)+', eMail) end; |
Hier ist noch der Link, von dem ich diese Informationen habe
www.delphipraxis.net...&highlight=email
_________________ Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 04.03.06 14:10
Die genutzte Maske im dritten Beispiel ist unvollständig. Wer's testen will:
benbe at benbe dot omorphia dot org
Wird von allen 3en als falsch eingestuft, ist aber eine gültige Mail-Adresse. Meine Masken von oben erkennen selbst diese Adresse.
Oder noch einmal vollständig nach ARPA-\DNS-Standard:
Quelltext 1:
| [\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}) |
Hatte oben noch ein paar Kleinigkeiten übersehen.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Olli_Sahr 
      
Beiträge: 83
D5 Prof, D7 Architect
|
Verfasst: So 12.03.06 17:33
Liebe Community,
danke für Eure Antworten.
In der Zwischenzeit hatte ich eine andere Lösung implementiert.
Meine Anwender sind am PC sehr unerfahren.
Sie haben eine Emailadresse eingegeben, die falsch war und nur die Meldung erhalten, dass sie falsch ist (das @ hat gefehlt).
Da die Meldung nicht gesagt hat, was daran falsch ist, haben sie bei mir angerufen und mich gefragt, was denn falsch ist.
Ich habe mich daher entschlossen die Prüfung manuell zu machen (nicht per RegEx), da ich so für jeden Fehlerfall ausgeben kann, was da falsch ist.
Meine Lösung schaut so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132:
|
function AnzahlZeichenInString(aString: string; aZeichen: char): integer;
var counter: integer;
begin result := 0; for counter := 1 to length(aString) do if (aString[counter] = aZeichen) then inc(Result); end;
function PosRight(aString: string; aSuchZeichen: Char): integer;
var counter: integer;
begin
result := -1;
for counter := length(aString) downto 1 do
if aString[counter] = aSuchZeichen then begin result := counter; exit; end;
end;
function ValidateEmailaddress(aEmail: string): string;
var counter: integer; tmpString: string;
begin
result := '';
if length(aEmail) < 7 then begin result := 'Länge'; exit; end;
if (AnzahlZeichenInString(aEmail, '@') <> 1) then begin result := '@ darf genau 1x vorkommen!'; exit; end;
if (AnzahlZeichenInString(aEmail, '.') < 1) then begin result := 'Mindestens ein Punkt erforderlich!'; exit; end;
if pos('..', aEmail) > 0 then begin result := '".." nicht erlaubt!'; exit; end;
for counter := 1 to length(aEmail) do begin if not (aEmail[counter] in ['a'..'z', 'A'..'Z', '0'..'9', '_', '-', '.']) then begin tmpString := aEmail[counter]; if tmpString = ' ' then tmpString := 'Leerzeichen'; result := 'Sonderzeichen "' + tmpString + '" nicht erlaubt!'; exit; end; end;
if pos('@', aEmail) < 3 then begin result := 'Vor dem @ müssen mindestens 2 Zeichen kommen'; exit; end;
if (aEmail[1] = '.') then begin result := 'Darf nicht mit . beginnen'; exit; end;
tmpString := RightStr(aEmail, (Length(aEmail) - pos('@', aEmail)));
if pos('.', tmpString) = 0 then begin result := 'Nach dem @ muss auch ein Punkt kommen'; exit; end;
if pos('.', tmpString) < 3 then begin result := 'Zwischen @ und letztem Punkt muss mind. 2 Zeichen sein'; exit; end;
if (length(aEmail) - PosRight(aEmail, '.')) < 2 then begin result := ' Nach letztem Punkt mindestens 2 Zeichen'; exit; end;
Result := 'Email Korrekt';
end; |
Die Hinweistexte werden noch ordentlich formuliert (da kommen Konstanten rein).
Ich weiß nicht, ob es momentan die Domain-namen mit Ä, Ö und Ü git (www.müller.de).
Falls ja, muss ich die Prüfung dahingehend erweitern (die Buchstaben bei den Sonderzeichen hinzufügen). Diese Ä, Ö und Ü dürfetn aber nicht in der Landeskennung (.DE, .COM) vorkommen, oder sind die da auch erlaubt?
Was sagt ihr?
Ist meine Prüfung vollständig?
Was könnte man optimieren (ohne, dass die Lesbarkeit darunter leidet)?
Mir war es wichtig, dass der User (Looser) genau gesagt bekommt, was an der Adresse nicht stimmt, damit er es berichtigen kann.
Danke für Eure Hilfe.
Gruß
OLLI
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 12.03.06 18:42
ich würde deine letzte result zuweisung zu anfang setzen...
bei machen punkten bin ich mir allerdings nicht sicher ob sie wirklich verboten sind... z.b. doppelpunkt... und dass vor dem @ zeichen zwei zeichen stehen müssen... aber eines wär sicher.
|
|
Born-to-Frag
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: So 12.03.06 19:10
_________________ Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
|
|
Olli_Sahr 
      
Beiträge: 83
D5 Prof, D7 Architect
|
Verfasst: Mo 13.03.06 21:45
Hallo,
danke für die Antworten!
Grenzgaenger hat folgendes geschrieben: | ich würde deine letzte result zuweisung zu anfang setzen...  |
Also die letzte Anweisung:
Delphi-Quelltext 1:
| Result := 'Email Korrekt'; |
hatte ich nur zu testzwecken drinnen (hatte ein ShowMessage, und da wollte ich im Erfolgsfall was hinschreiben).
Es wird an Result nur ganz am Anfang der Wert '' zugewiesen und dann im Fehlerfall dann er entsprechende Text.
Born-to-Frag hat folgendes geschrieben: | Dann brauchst du auch die ganzen begins und Exits nicht mehr  |
Warum?
Ich will, sobald ein Fehler auftritt, nicht weiter prüfen.
Wenn die Email kleiner als 8 Zeichen ist, brauche ich die restlichen Kriterien überhaupt nicht prüfen....
Die Exits spare ich mir nur, wenn ich mit ELSE arbeite:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if [ErstePrüfung] = false then fehlertext := 'Fehlertext für ersten Fehler' else
if [ZweitePrüfung] = false then fehlertext := 'Fehlertext für zweiten Fehler' else
if [DrittePrüfung] = false then fehlertext := 'Fehlertext für dritten Fehler' else ... |
Und das wollte ich nicht machen, da die Verschachtelung zu tief wird (zu viele unterebenen, zu weit eingerückt).
Grenzgaenger hat folgendes geschrieben: | bei machen punkten bin ich mir allerdings nicht sicher ob sie wirklich verboten sind... z.b. doppelpunkt... und dass vor dem @ zeichen zwei zeichen stehen müssen... aber eines wär sicher. |
Ich habe bei uns in der Firma einen Fachmann gefragt, der meinte, dass vor dem @ auch ein Zeichen stehen darf.
Und dass das erste Zeichen kein Punkt, kein Bindestrich und kein Unterstrich sein darf.
Angeblich darf eine Emailadresse auch ein % enthalten (er selber hatte mal so eine).
Welche Kriterien könnte man sonst noch prüfen?
Oder reichen meine Prüfungen aus?
Danke für Eure Hilfe!
Gruß
OLLI
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 14.03.06 01:19
es gibt im iNet irgend wo eine seite, request of specifications... wo alle ports bis ins kleinste mit beschrieben sind... z.b. der für SMTP und für POP3... vielleicht kennt einer von euch die addy oder den suchbegriff...
dort ist der aufbau der addy und der domain bis ins kleinste definiert...
bitte hier posten, ich selbst finde den link leider nicht mehr...
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 14.03.06 09:09
Die Spezifikation findest Du auf der RFS-Seite: www.rfc-editor.org.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Olli_Sahr 
      
Beiträge: 83
D5 Prof, D7 Architect
|
Verfasst: Di 14.03.06 21:13
Hallo,
eine Frage habe ich noch:
stimmt es, dass eine Emailadresse, die am Ende die Endung .TEST hat, nicht versendet wird?
Also beispielsweise max@mustermann.test oder max@mustermann.de.test.
Wenn das so ist, dann muss ich das natürlich auch abfangen.
Danke und Gruß
OLLI
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 15.03.06 01:08
danke an BEN für das schlüsselwort RFC damit hab ich auch gleich folgendes de.wikipedia.org/wiki/Request_for_Comments gefunden. unter SMTP solltest du die komplette syntax für eMails senden bekommen.
die .TLD .TEST kann ich mir nicht vorstellen, dass es hierfür eine sonderbehandlung gibt. wahrscheinlich kommt es daher, dass die .TLD nicht definiert ist und somit wieder an den absender zurückgesandt wird... kannst ja nach dem RFC studium einen kommentar posten 
|
|
|