Email validatie snippet
Er zwerven op het wereldwijde web heel wat email validatie scripts rond, die ook prima functioneren. Zo was ook het script van Hipska (http://phphulp.nl/php/scripts/11/1622/) een tijd geleden heel prima. Het viel me echter op dat een groot deel alleen op syntax controleerde, terwijl php speciale functies heeft om email te controleren op bestaan. Echter, bij de scripts die dit wel gebruikten, werd er vanuit gegaan dat dit ondersteund werd door de server. Daarom heb ik een iets flexibelere versie gemaakt, die op verschillende platformen en op verschillende php versies uitgevoerd kan worden. Zoals eerder vermeldt, het gedeelte dat gebruikmaakt van checkdnsrr en getmxrr is afkomstig van Hipska. De preg_match is ook niet van mij afkomstig, die komt van php.net, user note van reportingsjr at gmail dot com bij de functie checkdnsrr. Indien jullie opmerkingen hebben, houd het vriendelijk, dan blijven we allemaal vrolijk. update: Heb zelf helaas geen host waar ik even een voorbeeld kan laten zien. Zal onder de code eventjes laten zien hoe je het zelf kan testen. update2: Even een fix, had achter een return geen ; staan, shame on me.... update3: Jezpur wees op een veel logischere opbouw...... again, shame on me.. update4: Zoals Agirre zelf al vermoedde, is filter_var niet zo streng in het controleren als de preg_match. Zo zal test@test door filter_var gezien worden als valid, en de preg_match niet. Daarom is in dit geval gekozen om niet gebruik te maken van filter_var. Update5: (final update hopelijk). Ik stel Agirre toch in zijn gelijk dat filter_var volstaat hier. Toch zullen beide versies hier blijven staan, maar de functie met preg_match zal vermeld worden als "oud".
Versie zonder preg_match (werkt met filter_var functie)
<?php
function checkmail($email){
/* Check OS script is executed on*/
/* Checkdnsrr Windows support from php 5.3*/
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' and version_compare(PHP_VERSION, '5.3.0') === -1) {
/* PHP version doesn't support getmxrr and checkdnsrr*/
/* Syntax control function here*/
return filter_var($email,FILTER_VALIDATE_EMAIL) != false;
}
/* PHP version higher or equal to 5.3.0*/
/* Function by Hipska @ http://www.phphulp.nl/php/scripts/11/1622/ */
if(preg_match('#.+@(?<host>.+)#',$email,$match) > 0 and getmxrr($match['host'],$mxhosts)){
/* Found MX records*/
$valid = false;
/* Walkt through MX records for valid*/
while($host = next($mxhosts) and !$valid){
/* IPv4 or IPv6 will do*/
$valid = checkdnsrr($host, 'A') or checkdnsrr($host,'AAAA');
}
return $valid;
}
/* No valid email --> no correct host name or no MX records found*/
return false;
}
?>
Versie met preg_match:
<?php
function checkmail($email){
/* Check OS script is executed on*/
/* Checkdnsrr Windows support from php 5.3*/
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' and version_compare(PHP_VERSION, '5.3.0') === -1) {
/* PHP version doesn't support getmxrr and checkdnsrr*/
/* Syntax control function here*/
return preg_match('/^\w[-.\w]*@(\w[-._\w]*\.[a-zA-Z]{2,}.*)$/', $email);
}
/* PHP version higher or equal to 5.3.0*/
/* Function by Hipska @ http://www.phphulp.nl/php/scripts/11/1622/ */
if(preg_match('#.+@(?<host>.+)#',$email,$match) > 0 and getmxrr($match['host'],$mxhosts)){
/* Found MX records*/
$valid = false;
/* Walkt through MX records for valid*/
while($host = next($mxhosts) and !$valid){
/* IPv4 or IPv6 will do*/
$valid = checkdnsrr($host, 'A') or checkdnsrr($host,'AAAA');
}
return $valid;
}
/* No valid email --> no correct host name or no MX records found*/
return false;
}
?>
[b]Zelf testen[/b]
Om het zelf even te testen (zie update bij beschrijving):
<?php
include "functies.php";
if($_SERVER['REQUEST_METHOD'] == "POST") {
echo 'Result custom checkmail:<br />';
echo (checkmail($_POST['email'])) ? 'valid' : 'invalid';
echo '<br /><br />';
echo 'Result filter_var:<br />';
echo (is_string(filter_var($_POST['email'],FILTER_VALIDATE_EMAIL))) ? 'valid' : 'invalid';
echo '<br /><br />';
echo 'Result forced preg_match:<br />';
echo (preg_match('/^\w[-.\w]*@(\w[-._\w]*\.[a-zA-Z]{2,}.*)$/', $_POST['email'])) ? 'valid' : 'invalid';
echo '<br /><br /><a href="javascript: history.go(-1)"class="link_orange">Klik hier</a> om terug te gaan en opnieuw te proberen';
}
else {
echo 'Test email validation:<br /><br />
<form method="post" action="'.$_SERVER['PHP_SELF'].'">
Email: <input type="text" name="email">
<input type="submit" value="verzenden" name="verzenden">
</form>';
}
?>
Snel in elkaar geflanst..... (zorg dat je in de include de functie op een manier in je script krijgt)
Reacties
0