[PHP] probleem email validator

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een probleem met de volgende email validator:
PHP:
1
eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email);


Hij doet het eigenlijk altijd perfect behalve als je het emailadres info@ggznijmegen.nl invoert, enig idee hoe dit zou kunnen?
Ik heb al verschillende dingen geprobeerd maar het lijkt erop dat hij nijmegen niet goedkeurt, maar ik heb geen idee waarom.

Alvast bedankt

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

ik ben geen held met regexen maar ik weet wel dat je met {2,3} achter de punt, de mist in gaat met tld's zoals .info, .museum etc.

Aunt bunny is coming to get me!


Acties:
  • 0 Henk 'm!

  • KompjoeFriek
  • Registratie: Maart 2001
  • Laatst online: 15-08 22:46

KompjoeFriek

Statsidioot

Misschien komt het omdat je een POSIX regular expression functie gebruik ipv een PERL compatible regular expression functie.

WhatPulse! - Rosetta@Home - Docking@Home


Acties:
  • 0 Henk 'm!

  • Cobalt
  • Registratie: Januari 2004
  • Laatst online: 28-08 14:11
Met een functie als string gethostbyname ( string $hostname ) zou je ook de domeinnaam kunnen checken.

[ Voor 28% gewijzigd door Cobalt op 12-07-2009 15:41 ]


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 14:20

DataGhost

iPL dev

Ik dat het komt door greedyness. Ik vraag me dan ook af met welke adressen hij 'eigenlijk altijd perfect werkt'.

Afgezien hiervan is mailadresvalidatie met een regex (in ieder geval deze) eigenlijk niet echt de bedoeling. Lees ook de volgende pagina voor meer informatie: http://www.regular-expressions.info/email.html. Als je per se een geldig mailadres wil hebben moet je niet gaan valideren maar ervoor zorgen dat degene die het adres invult er ook daadwerkelijk baat bij heeft een geldig adres in te voeren, bijvoorbeeld door een code te sturen naar het opgegeven adres, om daarmee de gevraagde gegevens op te kunnen vragen. Betere validatie dan dat krijg je niet.
Cobalt schreef op zondag 12 juli 2009 @ 15:39:
Met een functie als string gethostbyname ( string $hostname ) zou je ook de domeinnaam kunnen checken.
dit.mailadres.bestaat.niet.maar.is.wel.geldig@gmail.com. Valideer ze!

[ Voor 17% gewijzigd door DataGhost op 12-07-2009 15:43 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Probleem opgelost!
Na de webpagina gelezen te hebben die DataGhost gepost had, kwam ik erachter dat het door de gethostbyname tag kwam dat het e-mailadres als fout werd bestempeld. Als je namelijk in de adresbalk ggznijmegen.nl intypt krijg je de melding dat dit adres niet gevonden kan worden, met www. ervoor wel.
Nu heb ik de volgende code en werkt het:
PHP:
1
2
3
4
5
6
7
8
9
10
11
function checkmail($email) 
{ 
    $email_host = explode("@", $email); 
    $email_host = "www." .$email_host['1']; 
    $email_resolved = gethostbyname($email_host); 

    if ($email_resolved != $email_host && eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$",$email)) 
        $valid = 1; 

    return $valid; 
}


Bedankt!

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13:14
Lees anders ook even de relevante RFC er op na. Je sluit nu een heleboel e-mailadressen uit.
Zo mis je nu adressen met de karakters ! # $ % & ' * + / = ? ^ _ ` { | } en ~, of zoiets simpels als het "info"-tld.

Sowieso doe je nu nog half werk met de gefhostbyname. Dat er een A-record aan een hostname hangt wilt niet zeggen dat hier ook een MX-record aanhangt, welke nodig is voor e-mailverkeer.
En zoals dataghost aangeeft, je controleert nu wel of een e-mailadres syntactisch correct is maar weet nog steeds niet of deze daadwerkelijk bestaat.

Indien je tikfouten wilt voorkomen, laat de gebruiker het adres dan 2x invoeren.
Indien je zeker wilt weten dat het adres bestaat, verstuur dan een activatiecode.

Acties:
  • 0 Henk 'm!

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Gebruik preg_match in plaats van eregi, omdat ereg deprecated is en in PHP 6 er helemaal uit gaat.

By the way, het is handig om op MX record te checken op wat er achter het @ staat.

Deze functie gebruik ik vaak ervoor:
PHP:
1
2
3
4
5
6
7
8
9
10
public function check_email($email) {
    if (empty($email) || strpos($email, '@') === FALSE)
        return FALSE;

    if ( ! function_exists('checkdnsrr'))
        return (bool) preg_match('/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD', $email);

    // Check if the email domain has a valid MX record
    return (bool) checkdnsrr(preg_replace('/^[^@]+@/', '', $email), 'MX');
}

[ Voor 76% gewijzigd door eghie op 12-07-2009 18:31 ]


Acties:
  • 0 Henk 'm!

  • Rian
  • Registratie: Januari 2005
  • Laatst online: 21-05 09:42
eghie schreef op zondag 12 juli 2009 @ 18:21:
Gebruik preg_match in plaats van eregi, omdat ereg deprecated is en in PHP 6 er helemaal uit gaat.
En let er daarbij wel op dat ereg uitgaat van POSIX-regexes, waar preg_match werkt met perl compatible regexes.

Acties:
  • 0 Henk 'm!

  • Peter
  • Registratie: Januari 2005
  • Laatst online: 13-09 17:10
Natuurlijk kun je ook de ingebakken filter extensie gebruiken, vanaf PHP 5.2. Die gebruikt intern een PCRE-expressie die completer is dan jouw POSIX-expressie :)

Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 13:30
frickY schreef op zondag 12 juli 2009 @ 16:46:
Indien je tikfouten wilt voorkomen, laat de gebruiker het adres dan 2x invoeren.
Indien je zeker wilt weten dat het adres bestaat, verstuur dan een activatiecode.
Voor dingen als gebruikersregistratie enzo: eens.

Maar voor iets simpels als een contactformuliertje? Dan zou ik ook een wat simpelere aanpak kiezen...
frickY schreef op zondag 12 juli 2009 @ 16:46:
Lees anders ook even de relevante RFC er op na. Je sluit nu een heleboel e-mailadressen uit.
Zo mis je nu adressen met de karakters ! # $ % & ' * + / = ? ^ _ ` { | } en ~, of zoiets simpels als het "info"-tld.
Dat, en daarnaast kun je nu ook geen twee punten achter elkaar gekbruiken. Dat lijkt me voor de @ ook gewoon geldig. (pietje..puk@blaat.nl)
Verwijderd schreef op zondag 12 juli 2009 @ 16:05:
Probleem opgelost!
Na de webpagina gelezen te hebben die DataGhost gepost had, kwam ik erachter dat het door de gethostbyname tag kwam dat het e-mailadres als fout werd bestempeld. Als je namelijk in de adresbalk ggznijmegen.nl intypt krijg je de melding dat dit adres niet gevonden kan worden, met www. ervoor wel.
En wat doe je nu de volgende keer als je toevallig een domeinnaam tegenkomt waar het www-subdomein niet bestaat? Het script weer terug aanpassen ofzo...?

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
PHP:
1
2
3
4
function isValidEmail ( $email )
{
    return preg_match ( '#^[a-z0-9.!\#$%&\'*+-/=?^_`{|}~]+@([0-9.]+|([^\s\'"<>@,;]+\.+[a-z]{2,6}))$#si', $email );
}

March of the Eagles


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hacku schreef op zondag 12 juli 2009 @ 18:33:
PHP:
1
2
3
4
function isValidEmail ( $email )
{
    return preg_match ( '#^[a-z0-9.!\#$%&\'*+-/=?^_`{|}~]+@([0-9.]+|([^\s\'"<>@,;]+\.+[a-z]{2,6}))$#si', $email );
}
En zo kun je nog wel 1001 variaties posten. Mijn favoriet: deze :X

Feit blijft dat email validatie met regex of een aantal "weinig voorkomende variaties" uitsluit, of de regex wordt als in voorgaande link en alles daartussenin. Het enige echt zinnige antwoord is dan ook dat van DataGhost.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Exception
  • Registratie: Augustus 2006
  • Laatst online: 17-09 11:10
Je kunt ook de filter_var-functie gebruiken:
PHP:
1
2
3
4
5
6
7
8
9
10
<?php
$email = 'joe@example.com';

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "This email address is considered valid.";
}
else {
    echo "This email address is invalid.";
}
?>

[ Voor 13% gewijzigd door Exception op 13-07-2009 16:32 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Exception schreef op maandag 13 juli 2009 @ 16:31:
Je kunt ook de filter_var-functie gebruiken:
Mits PHP >= 5.2.0 ja en dat was al eens genoemd ;)

[ Voor 29% gewijzigd door RobIII op 13-07-2009 16:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Hipska
  • Registratie: Mei 2008
  • Laatst online: 15-09 21:08
Ik had een tijdje geleden dit gemaakt om emailadres te valideren adhv mx records van de domeinnaam.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

function check_email_mx($email){
    if(preg_match('#.+@(?<host>.+)#',$email,$match) > 0 and getmxrr($match['host'],$mxhosts)){
        // mx records gevonden
        
        $valid = false;
        
        // mx records overlopen op zoek naar een geldige
        while($host = next($mxhosts) and !$valid){
            // een IPv4 of IPv6 adres volstaat
            $valid = checkdnsrr($host, 'A') or checkdnsrr($host,'AAAA');
        }
        
        return $valid;
    }
    
    // geen geldig mail adres wegens geen 
    // correcte hostname of geen mx records
    return false;
}

?>

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ik doe gewoon zo:

PHP:
1
2
3
4
5
6
7
8
9
$validator = new Zend_Validate_EmailAddress();
if ($validator->isValid($email)) {
    // email appears to be valid
} else {
    // email is invalid; print the reasons
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}


En als ik ook de MX records wil controleren, dan verander ik regel 1 in:

PHP:
1
$validator = new Zend_Validate_EmailAddress(array('mx' => true));


Er zijn echt duizenden van de email validatie controles en 99% daarvan is gewoon slecht of niet compleet. Ik gebruik liever een standaard ding, dan heb je meer zekerheid dat het gewoon goed werkt.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
HuHu weer met zn ZF code :+ ;)

Ik gebruik t zelf overigens ook en t werkt perfect. Vaak krijg ik het geldige "mijnnaam+naamwinkel@gmail.com" er niet doorheen terwijl dit wel hoort. Jammer dat de meeste validators de RFC-standaard niet aanhouden qua geldigheid.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Het werkt ook gewoon prachtig :P.

Wat mij betreft kan je ook gewoon dit doen:

PHP:
1
$valid = filter_var($mail, FILTER_VALIDATE_EMAIL);


Al is ook die niet helemaal perfect volgens RFC2822. Maar het is altijd nog beter dan zelf lopen kutten met regular expressions.

Acties:
  • 0 Henk 'm!

  • dwilmer
  • Registratie: Oktober 2008
  • Laatst online: 25-01 09:50
Hier heb ik toevallig vandaag een stukje over opgezocht. Toen kwam ik op dit artikel uit:
http://www.linuxjournal.com/article/9585

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
HuHu schreef op donderdag 01 oktober 2009 @ 10:40:
Het werkt ook gewoon prachtig :P.

Wat mij betreft kan je ook gewoon dit doen:

PHP:
1
$valid = filter_var($mail, FILTER_VALIDATE_EMAIL);


Al is ook die niet helemaal perfect volgens RFC2822. Maar het is altijd nog beter dan zelf lopen kutten met regular expressions.
Tja, kan ook. Ik heb zelf geen (nouja, weinig) ervaring met filter_var (), maar had crisp daar niet eens een stukje over geschreven in zijn blog? Lopen kutten met regular expression is op zich geen probleem, je hoeft het maar één keer te schrijven.

March of the Eagles


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Hacku schreef op donderdag 01 oktober 2009 @ 22:51:
[...]


Tja, kan ook. Ik heb zelf geen (nouja, weinig) ervaring met filter_var (), maar had crisp daar niet eens een stukje over geschreven in zijn blog? Lopen kutten met regular expression is op zich geen probleem, je hoeft het maar één keer te schrijven.
Het probleem met regular expressions (of dingen die andere mensen zelf hebben geschreven op hun site en jij overneemt) is dat ze meestal onwijs kut zijn om te maken en bijna nooit goed werken. Er zijn altijd wel gevallen te verzinnen waarbij het niet werkt. Of ze zijn te simpel en laten teveel toe, of ze zijn te strikt en staan te weinig toe, of er zitten fouten in. Wil je er eentje die alle gevallen van emailadres validatie pakt, dan heb je een expressie nodig van een half A4-tje ofzo.

Dan kun je, naar mijn mening, beter een standaard iets gebruiken waarvan aangetoond is dat het goed of redelijk goed werkt, dan zelf gaan lopen kutten en er niet uit komen.

Kijk... het kan natuurlijk zijn dat je een regular expression fetisj hebt en het gewoon zo goed mogelijk wil proberen of leren. Maar gezien de kwaliteit van de expressie in de topic-start gok ik dat dát niet het geval is.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
filter_var gebruiken, elke discussie of poging om het zelf echt goed te doen is zonde van je tijd. Als je per se oude PHP installs moet ondersteunen definieer je aan het begin van je script filter_var indien !function_exists en gebruik je daarvoor een iets te ruime regex.

Klaar.

{signature}

Pagina: 1