2014-02-12 28 views
0

我試圖建立一個形式良好電子郵件驗證PHP電子郵件驗證,我想使用filter_var()preg_match()結合,但我如果它下面的語句是行不通的。似乎只有一個條件得到滿足。我還能怎樣寫這個才能起作用?用filter_var()和的preg_match()

$email = (isset($scrubbed['email'])) 
    ? filter_var($scrubbed['email'], FILTER_VALIDATE_EMAIL, FILTER_SANITIZE_EMAIL) 
    : NULL 
; 

if ((!$email) && (!preg_match("/^[\w.-][email protected][\w.-]+\.[A-Za-z]{2,6}$/", $email))) { 
    echo 'Invalid Email Address, please correct errors'; 
} else { 
    $email = strip_tags($scrubbed['email']); 
} 
+0

如果你已經用'filter_var'檢查你的電子郵件,爲什麼你要使用'preg_match'? 'filter_var'是不夠的? – excanoe

+0

「有**好**電子郵件驗證」定義好?實際上你可能會覺得很難。也許開源解決方案可能會更好,然後重新發明輪子。 – AlexP

回答

2

什麼是再次驗證電子郵件地址的目的是什麼? PHP的filter_var()已經允許各種電子郵件的變體,你可能永遠不會創建一個正則表達式,甚至接近他們使用的。

我使用的電子郵件驗證如下所示(適用於您的代碼):

<?php 

if (isset($scrubbed["email"])) { 

    // @see http://stackoverflow.com/a/574698/1251219 
    if (strlen($scrubbed["email"]) > 254) { 
     echo "The email address is too long: it must be 254 or less."; 
    } 

    // Validate syntax with PHP. 
    if (($email = filter_var($scrubbed["email"], FILTER_VALIDATE_EMAIL)) === false) { 
     echo "The email address has an invalid syntax."; 
    } 

    // Validate DNS reachability. 
    $host = substr($email, strrpos($email, "@") + 1) . "."; 

    if (!checkdnsrr($host, "A") && !checkdnsrr($host, "AAAA") && !checkdnsrr($host, "MX")) { 
     echo "The email address is unreachable."; 
    } 
} 

?> 

沒有想過什麼PHP的正則表達式樣子?

/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/iD 

更多信息可在Comparing E-mail Address Validating Regular Expressions找到。