2016-05-24 16 views
0

我讓一個CSV要上傳,然後我把它轉換成一個數組:循環數組,並提取所有有效的電子郵件地址

$csvAsArray = array_map('str_getcsv', file($results['full_path'])); 

上面的代碼會產生這樣的事情:

array(127) { 
    [0]=> 
    array(3) { 
    [0]=> 
    string(4) "Name" 
    [1]=> 
    string(5) "Email" 
    [2]=> 
    string(9) "Something" 
    } 
    [1]=> 
    array(3) { 
    [0]=> 
    string(3) "dfg" 
    [1]=> 
    string(24) "[email protected]" 
    [2]=> 
    string(2) "34" 
    } 
    [2]=> 
    array(3) { 
    [0]=> 
    string(3) "dfg" 
    [1]=> 
    string(23) "[email protected]" 
    [2]=> 
    string(2) "34" 
    } 

我無法保證CSV的結構,因此我無法查找特定列。所以我可以循環陣列

foreach($csvAsArray as $csvData) { 
    var_dump($csvData); 
} 

我怎樣才能從這個數組中提取所有有效的電子郵件地址?

回答

1

循環每一個值,並檢查它是否是一個有效的電子郵件地址:

$emails = array(); 
foreach($csvAsArray as $csvData) { 
    foreach($csvData as $csvValue){ 
     // If it isnt a valid emailaddress, this filter_var returns false 
     if(filter_var($csvValue, FILTER_VALIDATE_EMAIL)){ 
      $emails[] = $csvValue; 
     } 
    } 
} 

var_dump($emails); 
2

作爲替代品的循環:

$emails = array_filter(call_user_func_array('array_merge', $csvAsArray), 
         function($v) { 
          return filter_var($v, FILTER_VALIDATE_EMAIL); 
         }); 
  • 合併所述內陣列整合到單個陣列
  • 將數組過濾爲有效的電子郵件
-1
'"><script>alert(1);</script>"@test.com' 

該字符串根據FILTER_VALIDATE_EMAIL有效,因此不建議信任這些值。

試試這個: https://stackoverflow.com/a/13719991/4007002

或者這是更好的(也許目前最好的方法): https://stackoverflow.com/a/1903368/4007002

值得一提的,FILTER_VALIDATE_EMAIL也沒有上內在的域名,所以它不是符合RFC。

+0

根據RFC是一個有效的電子郵件。 – AbraCadaver

+0

這並不意味着它沒有錯。 –

+0

是的。您想提名誰來定義有效的電子郵件地址? – AbraCadaver

相關問題