【问题标题】:Loop array and extract all valid email addresses循环数组并提取所有有效的电子邮件地址
【发布时间】:2016-05-24 13:51:01
【问题描述】:

我允许上传 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) "something@something.com"
    [2]=>
    string(2) "34"
  }
  [2]=>
  array(3) {
    [0]=>
    string(3) "dfg"
    [1]=>
    string(23) "something@something.com"
    [2]=>
    string(2) "34"
  }

我无法保证 CSV 的结构,这就是我无法查找特定列的原因。所以我可以循环数组,例如

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

如何从这个数组中提取所有有效的电子邮件地址?

【问题讨论】:

    标签: php arrays csv


    【解决方案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);
                             });
      
      • 将内部数组合并为一个数组
      • 根据有效电子邮件过滤数组

      【讨论】:

        【解决方案3】:
        '"><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。

        【讨论】:

        • 根据 RFC,这是一个有效的电子邮件。
        • 是的。您想提名谁来定义有效的电子邮件地址?
        • 我的意思是允许可能不存在的恶意电子邮件地址是错误的。看起来你只是不想理解这里的观点,RFC 本身并没有错,但在某些情况下,根据 RFC 信任所有有效的东西是不安全的。
        • 我完全理解这一点。如果您在网络浏览器中显示它,那只是“不安全”,在这种情况下,您无论如何都应该对其进行清理。 htmlentities() 也许?相信任何用户提供的输入都是不安全的。
        猜你喜欢
        • 2015-11-19
        • 1970-01-01
        • 2017-01-11
        • 1970-01-01
        • 2015-12-07
        • 2019-01-28
        • 2016-01-29
        • 2015-11-19
        • 1970-01-01
        相关资源
        最近更新 更多