email auf gültigkeit testen
mandy
- php
0 romy0 Tom Wieczorek0 TomIRL
0 Sven Rautenberg
hi ihr,
ich möchte die email-eingabe mit folgender funktion testen:
function email2($email)
{
if (preg_match([1]+(.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+.)+([a-zA-Z]{2,3,4})$, $email))
{ return FALSE; }
else
{ return TRUE
$formularanzeigen = TRUE; }
}
bekomme dann allerdings eine fehlermeldung:
"Parse error: parse error, expecting `')''..."
weiß jemand von euch, woran das liegen kann?
danke im voraus!!
mandy
_a-zA-Z0-9- ↩︎
function email2($email)
{
if (preg_match([1]+(.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+.)+([a-zA-Z]
{2,3,4})$, $email))
{ return FALSE; }
else
{ return TRUE
$formularanzeigen = TRUE; }
}
weiß jemand von euch, woran das liegen kann?
finde den Fehler nicht, allerdings funktioniert
if(eregi("[2]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,4}$",$email))
genausogut
vielleicht hilft es
vielleciht liegt es ja an den fehlenden Anführungszeichen??? keine Ahnung ob preg_match die braucht
danke im voraus!!
mandy
romy
vielleicht hilft es
vielleciht liegt es ja an den fehlenden Anführungszeichen???
Also meiner Meinung braucht JEDE Funktion Anführungszeichen, wenn man keine Variablen übergibt...
Außerdem steht da doch was von expecting ' bei der Fehlermeldung
---Schnipp PHP-Funktionsreferenz
int preg_match ( string pattern, string subject [, array matches [, int flags]])
^^ da steht ja "string pattern" also Anführungszeichen könnten da imo Wunder wirken ;-)
Ich hab da folgenden Quellcode gefunden, frag mich nicht woher vewende ich schon ewig und der funktioniert:
<?
// keine parameter, also initialisieren
if (!isset($in))
$in=0;
$name="";
$email="";
$subject="";
$message="";
}
// Fehlerverarbeitung
if ($in == 1) {
if ($message == "") $fehler ='Bitte eine Nachricht in das Textfeld eingeben.<BR>';
if ($subject == "") $fehler = 'Bitte einen Betreff angeben.<BR>';
if ($name == "") $fehler = 'Bitte deinen Namen angeben.<BR>';
if ($email != "" AND (!eregi (".+@.+\..+",$email))) $fehler = 'Deine E-Mail Adresse ist ungültig!<BR>';
}
if (isset($fehler)) { echo "<H3>Fehler!</H3>\n<DIV>".$fehler."</DIV>"; $in=0; }
if ($in == 0) {
?>
Dann mußte natürlich noch $in ins Formular bringen!
Moin!
ich möchte die email-eingabe mit folgender funktion testen:
Mit diesem regulären Ausdruck testest du sicherlich alles mögliche, nur leider nicht die Gültigkeit einer EMail-Adresse.
Es ist leider immer noch so: Ob eine Mailadresse existiert oder nicht kann man nur wissen, wenn man eine Mail dorthin geschickt hat und eine positive Antwort des Empfängers zurückkam. Bei Newsletteranmeldung sollte man aus diesem Grunde das Double-Opt-In-Verfahren anwenden: Mail an die angegebene Adresse schicken, in der ein Link drinsteht, der besucht werden muß - erst dann kann die Mailadresse als gültig und ernstgemeint übernommen werden.
Wenn es aber ohnehin anhand der reinen Adresse keinen Weg gibt festzustellen, ob diese Mailadresse existiert oder nicht, dann kann man sich im Prinzip komplexe Prüfungen sparen, weil sie ohnehin meist echt gültige Mailadressen ausschließen!
Konkret auf deine Funktion bezogen: Es gibt mehr als nur Usernamen der Form XXX.YYY@... Beispielsweise kann man auch sowas als Usernamen benutzen:
"Klaus Mustermann"@...
irgendwer.@... (der Punkt an letzter Stelle wurde mal von T-Online erlaubt)
Die Usernamen einzuschränken ist eine ganz schlechte Idee. Deshalb ist der einzige wirklich sinnvolle reguläre Ausdruch für den Usernamen: (.*)@
Dann gehts weiter mit den Domains. Hier sind die Regeln etwas strenger: Nur Buchstaben, Zahlen und das Minuszeichen für beliebige Subdomains, getrennt durch einen Punkt. Die Top-Level-Domain besteht dann nur aus Buchstaben. Aber wievielen? Mindestens 2. Aber 4 Buchstaben als Maximum sind falsch! Es gibt beispielsweise die TLD ".museum", welche 6 Zeichen hat. Die ist zwar nur für Museen gedacht, aber auch Museen dürfen mailen.
Und da ICANN in Zukunft sicher noch die eine oder andere weitere TLD genehmigen dürfte, ist es absolut blödsinnig, hier eine zeichenmäßige Begrenzung einführen zu wollen.
Summa summarum besteht eine EMail eigentlich nur aus dem folgenden regulären Ausdruck:
.*@[a-zA-Z0-9-.]+.[a-zA-Z]{2,}
Dieser Ausdruck kriegt einigermaßen genau total abwegige Angaben gefiltert.
Alternativ kannst du gerne die entsprechende RFC angucken und einen (es steht hier im Archiv drin) zweiseitigen regulären Ausdruck zusammenbasteln bzw. kopieren, der für wirklich alle möglichen Mailadressen, die erlaubt sind, korrekte Ergebnisse produziert. Ich halte das aber für Overkill, da die syntaktische Korrektheit einer Mailadresse nur die halbe Wahrheit ist:
Erstens kann sie immer noch ausgedacht sein.
Zweitens könnten auch syntaktisch laut RFC falsche Mailadressen tatsächlich existieren - solange die Mailserver es irgendwie hinkriegen, die Mail an den Empfängermailserver weiterzuleiten, und der den Usernamen erkennt, funktioniert das sogar.
Drittens hilft es auch nicht, wenn die Mailadresse existiert (d.h. ohne Unzustellbarkeitsvermerk zurückkommt) - sie muss auch benutzt und gelesen werden und nicht in /dev/null verschwinden.
Alle diese Überlegungen reduzieren die in meinen Augen sinnvolle Mailprüfung auf diese Punkte (vgl. regulärer Ausdruck):
1. Ist ein @ enthalten?
2. Steht davor mindestens 1 Zeichen?
3. Steht danach mindestens 1 Zeichen?
4. Kommt danach irgendwann ein Punkt?
5. Ist die Top-Level-Domain ganz am Ende?
6. Eine Mailadresse mit diesen Anforderungen ist mindestens 6 Zeichen lang: x@x.de (ja, es gibt einbuchstabige Second-Level-Domains: http://www.x.org.)
Dein konkretes Problem mit PHP liegt daran, dass du in der preg_match-Funktion die Begrenzungszeichen für den regulären Ausdruck vergessen hast. Siehe auch http://www.php.net/preg_match, erstes Beispiel.
- Sven Rautenberg
Hi,
nur noch'n Link, der das Thema sehr genau behandelt:
http://www.selfaktuell.teamone.de/tippstricks/programmiertechnik/email/index.html
viel Spaß
Mathias Bigge