ik wil een controle doen op een geldig emailadres

mijn script doe ik zo

if(!eregi('^([a-zA-Z0-9_-])@([a-zA-Z0-9_-]).([a-zA-Z]{2,3})$',[email protected]))
echo "fout";
}else{
echo "goed";
}

om een of andere reden blijkt het niet te werken zoals het hoort.
wie helpt me even vooruit?

is ^ en $ die begin en einde aanduiden van de string wel nodig?

en je bedoeld dat deze niet werkt?
inderdaad deze werkt niet zoals ik het verwacht,zou het normaal wel moeten werken?
<?php
if( !preg_match('/^[a-z0-9_\-]+(?:\.[a-z0-9_\-]+)*@[a-z0-9_\-]+\.[a-z]{2,3}$/i', '[email protected]') )
{
// Fout
}
?>
Als we even kijken naar het eerste deel van je pattern:

([a-zA-Z0-9_-])@

Hier zijn twee dingen mis. Ten eerste match je hier op maar 1 karakter. Een adres als [email protected] zou dus wel moeten matchen.

Ten tweede gebruik je eregi. Die matcht case insensitive, dus het is niet nodig om in je pattern zowel a-z als A-Z op te geven.

Ten derde (ja, ik kan niet tellen ;-) ) matcht een . op elk willekeurig karakter. Als je wilt matchen op een echte . zul je die moeten escapen met een backslash.

Met deze informatie in het achterhoofd kunnen we je code als volgt herschrijven:

if(!eregi('^([a-z0-9_-]+)@([a-z0-9_-]+)\.([a-z]{2,3})$',[email protected]))

Dit zou een stuk beter moeten werken, alhoewel bijvoorbeeld de domeinen .info, .aero en .museum hier zouden worden geweigerd, terwijl die wel degelijk correct zijn.

Het matchen van een email-adres is overigens niet heel erg eenvoudig. Als je alle adressen wilt accepteren die toegestaan zijn volgens RFC-822 wordt je regexp is iets van 6,5 kilobyte groot.

Reageren