2010-01-21 83 views
0

我有一個包含電子郵件地址作爲數組(email_address1 => name1,email2 => name2)格式的php數組。在一個陣列中過濾電子郵件地址-php

我需要檢查郵件是有效的,我可以foreach

foreach($arr as $email => $name) { 
    $new = array(); 
    if(filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    $new[$email] = $name; 
    } 
return $new; 
} 

我可以實現上述使用array_filter?語法是什麼?

array_filter($emails_arr, 'filter_var') ?? how about FILTER_VALIDATE_EMAIL parameter? 

謝謝。

+0

你真的不應該使用FILTER_VALIDATE_EMAIL - 它返回由RFC 3696多家* VALID *電子郵件地址無效,你可以得到一個腳本哪些不會失敗@ http://www.linuxjournal.com/article/9585 – Erik 2010-01-23 20:28:37

回答

1

由於您使用的電子郵件作爲陣列,你不能直接使用起來array_filterfilter_var。您必須編寫回調函數,您可以將其傳遞給array_filter,該函數在陣列上運行而不是;在這種情況下,您可以堅持使用您的foreach解決方案。

注意[email protected][email protected]都被認爲有效通過filter_var,因爲它只會考試的語法和語義不。

0

您可以創建自己的函數filter_email($ email),該函數只調用filter_var($ email,FILTER_VALIDATE_EMAIL)。

請記住,此檢查只是確認電子郵件地址有一個有效的格式,而不是它是有效的。

1

如果可能的話使用DNS/MX驗證。也許考慮使用一個類呢?一個很好的選擇將是http://framework.zend.com/manual/en/zend.validate.set.html#zend.validate.set.email_address

$emails = array(
    '[email protected]' => "user from beyond", 
    'lalala' => "Lala user", 
    '[email protected]' => "Mary with lamb" 
); 
$validator = new Zend_Validate_EmailAddress(
       Zend_Validate_Hostname::ALLOW_DNS | 
       Zend_Validate_Hostname::ALLOW_LOCAL, 
       true); // enable DNS checking and lastly enable MX checking 
foreach($emails as $email => $name){ 
    if ($validator->isValid($email)) { 
     $validEmails[$email] => $name 
    } else { 
     foreach ($validator->getMessages() as $message) { 
      echo "$message\n"; 
     } 
    } 
} 

試一下:)

0

您還可以使用filter_var_array:

$result = array_intersect_key($arr, array_fill_keys(filter_var_array(array_keys($arr), FILTER_VALIDATE_EMAIL), '')); 

array_keys:獲得其中包含您輸入的所有按鍵

filter_var_array數組:過濾值

array_fill_keys數組:創建一個數組哪些鍵是第一個輸入數組的值,值是第二個參數

array_intersect_key:返回來自第一個參數的所有值,這個鍵與其他參數中的一個鍵相對應

0

這需要嵌套函數的各種模糊使用,就像在Arkh的答案中一樣。爲了可維護性目的,我認爲你最好使用循環。 foreach是向涉及迭代器的代碼添加更多語義的真正好方法。

+0

晦澀?這些函數每次檢查數組部分中的php文檔時都會尖叫「鏈接我們」。 但是,是不是真正可維護和foreach看起來更多的邏輯。 – Arkh 2010-01-21 14:57:25

+1

當然,但所有這些功能都是屏蔽代碼的行爲,這是一個循環。 'array_map'對於快速構建原型和編寫精益代碼非常適用,但是對具有多個不同函數返回值作爲其參數的'array_map'調用進行解碼,所有操作相同的數據源都是不可讀的。 – 2010-01-21 15:20:58

0

您可以使用此:

return array_filter(array_map('trim', $emails), function ($email) { 
      return (filter_var($email, FILTER_VALIDATE_EMAIL)) 
       ? true 
       : false; 
     }); 

但作爲@Gordon寫道

注意[email protected][email protected]都被認爲是有效的通過filter_var,因爲它只會測試語法而不是語義。

所以,你可以檢查語法,但你應該做一些驗證檢查。例如。 Zend2/Symfony2或Laravel驗證器?

*您也可以查詢的域名:email

list($name, $emailDomain) = explode('@', $email); 
    unset($name); 
    if (!checkdnsrr($emailDomain, 'MX')) { 
     return false; 
    }