Autor Beitrag
Olli_Sahr
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 83


D5 Prof, D7 Architect
BeitragVerfasst: 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 user profile iconTino: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 16.03.2006 um 10:50
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:
ausblenden 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):
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 83


D5 Prof, D7 Architect
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 576

Win95, Win98 SE, WinXp Prof SP2
D7P, D8P, FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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 = 0or (Pos('..', sValue) > 0then 
  begin 
    Exit; 
  end
  NamePart := Copy(sValue, 1, iPos - 1); 
  ServerPart := Copy(sValue, iPos +1, Length(sValue)); 
  if (Length(NamePart) = 0or ((Length(ServerPart) < 4)) then 
  begin 
    Exit; 
  end
  iPos := Pos('.', ServerPart); 
  if (iPos = 0or (iPos >= (Length(ServerPart) - 1)) then 
  begin 
    Exit; 
  end
  Result := CheckAllowed(NamePart) and CheckAllowed(ServerPart); 
end;



Der Aufruf für diese Funktion wäre dann:

ausblenden 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:

ausblenden 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]*'); 

  // * stehen für beliebige Zeichen in beliebiger Anzahl 

  // [A-Z0-9] bedeutet, es muss an der Stelle zwingend 
  // ein Buchstabe (A-Z) oder eine Zahl (0-9) vorhanden 
  // sein 
  // am Anfang, vor und nach dem @, sowie vor und nach 
  // dem Punkt dürfen also keinerlei Sonderzeichen 
  // stehen (darüber könnte man evtl. streiten, weil ich 
  // jetzt nicht weiß, ob eine Adresse wie "?Hallo@du.net" 
  // erlaubt wäre - ich glaube nicht ...) 

  // @ und . sind die Zeichen, die vorkommen müssen 
end;



und Variante 3:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 83


D5 Prof, D7 Architect
BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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:
{------------------------------------------------------------------------------}
// Zählt, wie oft ein bestimmtes Zeichen in einem String vorkommt
{------------------------------------------------------------------------------}

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;

{------------------------------------------------------------------------------}
// Gibt zurück an welcher Position im String ein Suchzeichen ist (fängt am Ende des Strings an)
{------------------------------------------------------------------------------}

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;

{------------------------------------------------------------------------------}
// Prüft eine übergebene Emailadresse auf Gültigkeit und gibt zurück, warum sie falsch ist
{------------------------------------------------------------------------------}

function ValidateEmailaddress(aEmail: string): string;

var
   counter: integer;
   tmpString: string;

begin

   result := '';

   // Prüfe die Länge der Emailadresse (xx@yy.de -> mindestens 8 Zeichen)
   if length(aEmail) < 7 then
   begin
      result := 'Länge';
      exit;
   end;

   // Es darf nur EIN mal das @ vorkommen
   if (AnzahlZeichenInString(aEmail, '@') <> 1then
   begin
      result := '@ darf genau 1x vorkommen!';
      exit;
   end;

   // Es MUSS mindestens EIN mal ein Punkt vorkommen
   if (AnzahlZeichenInString(aEmail, '.') < 1then
   begin
      result := 'Mindestens ein Punkt erforderlich!';
      exit;
   end;

   // Doppelter Punkt (..) ist nicht erlaubt
   if pos('..', aEmail) > 0 then
   begin
      result := '".." nicht erlaubt!';
      exit;
   end;

   // Prüfung auf Sonderzeichen (auch auf Leerzeichen)
   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'// Ausgabe für Anwender sprechender
         result := 'Sonderzeichen "' + tmpString + '" nicht erlaubt!';
         exit;
      end;
   end;

   // vor dem @ muss mindestens zwei Zeichen stehen
   if pos('@', aEmail) < 3 then
   begin
      result := 'Vor dem @ müssen mindestens 2 Zeichen kommen';
      exit;
   end;

   // Erstes Zeichen darf kein . sein
   if (aEmail[1] = '.'then
   begin
      result := 'Darf nicht mit . beginnen';
      exit;
   end;

   // merke Dir den Text ab dem @ bis zum Ende (z.B. "mustermann.de")
   tmpString := RightStr(aEmail, (Length(aEmail) - pos('@', aEmail)));

   // Nach dem @ muss auch ein Punkt kommen
   if pos('.', tmpString) = 0 then
   begin
      result := 'Nach dem @ muss auch ein Punkt kommen';
      exit;
   end;

   // Zwischen @ und letztem Punkt muss mind. 2 Zeichen sein
   if pos('.', tmpString) < 3 then
   begin
      result := 'Zwischen @ und letztem Punkt muss mind. 2 Zeichen sein';
      exit;
   end;

   // Nach letztem Punkt mindestens 2 Zeichen
   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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: So 12.03.06 19:10 
user profile iconGrenzgaenger hat folgendes geschrieben:
ich würde deine letzte result zuweisung zu anfang setzen... :!:


Dann brauchst du auch die ganzen begins und Exits nicht mehr ;)

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 83


D5 Prof, D7 Architect
BeitragVerfasst: Mo 13.03.06 21:45 
Hallo,

danke für die Antworten!

user profile iconGrenzgaenger hat folgendes geschrieben:
ich würde deine letzte result zuweisung zu anfang setzen... :!:


Also die letzte Anweisung:

ausblenden 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.

user profile iconBorn-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:

ausblenden 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).

user profile iconGrenzgaenger 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 83


D5 Prof, D7 Architect
BeitragVerfasst: 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



BeitragVerfasst: Mi 15.03.06 01:08 
danke an BEN für das schlüsselwort Suche bei Google 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 ;-)