Php 如何有效地从联系人列表中提取姓名和电子邮件?

Php 如何有效地从联系人列表中提取姓名和电子邮件?,php,Php,我想让用户粘贴在一个新的线分隔联系人列表中,并有一个有效生成的姓名和电子邮件数组 假设条目的可能性为: John, foo@corp.com foo@corp.com, John John foo@corp.com foo@corp.com John foo@corp.com // will have the [name] key empty John // will not be considered if there is no email 目前我的解决方案是用分解\n然后用逗号分解,然后

我想让用户粘贴在一个新的线分隔联系人列表中,并有一个有效生成的姓名和电子邮件数组

假设条目的可能性为:

John, foo@corp.com
foo@corp.com, John
John foo@corp.com
foo@corp.com John
foo@corp.com // will have the [name] key empty
John // will not be considered if there is no email
目前我的解决方案是用
分解
\n
然后用逗号分解,然后猜测电子邮件和姓名在哪里。我承认这是完全不可靠的,这就是为什么我想看看其他人如何处理这个问题

我想要得到的数组是:

array(
 [0] => array(
         [name] => John,
         [email] => foo@corp.com
        )
 [1] => ...
)

有什么想法吗?

可以尝试这样做:

$array = preg_split('#[ |,]+#', $input);
  • 逐行阅读文件(它是一个文件?还是一个文本字符串?)
  • 按空格爆炸
  • 对于explode函数生成的每个数组,验证它是否是电子邮件地址(例如,使用),如果它有效,则您知道它是电子邮件地址,否则它就是名称
  • 然后还可以“清除”名称(例如,删除“,”)

  • 嗯,我有一个大致的想法:

  • 搜索最后一行@字符(以防有人使用包含@的愚蠢名称,因为人们喜欢这样做)。一封电子邮件只能包含一个@符号;如果它包含多封邮件,则该邮件无效
  • 找到@符号左侧的第一个空格。虽然电子邮件地址可能包含空格,但大多数电子邮件服务器处理错误,许多电子邮件提供商一开始就禁止使用空格,因此通常可以安全地说,任何电子邮件地址都不会包含空格
  • 将该字符上的字符串一分为二(您可以简单地使用
    substr()
    ,从0到该字符的位置,然后再到该字符的位置加1到末尾)。您将获得第一部分,即所有名称,其中可能包含名字、姓氏或其他信息。第二部分是电子邮件地址。如果@符号左侧没有空格,则可以暗示没有给出名称
  • 从两个字符串的开头和结尾修剪多余的空格和逗号(为了安全起见)
  • 您应该使用正则表达式验证电子邮件地址部分是否实际格式化为电子邮件地址

  • 如果您[真的]想添加对空格字符的支持,您可以始终直接查看@符号左侧的字符,如果它是双引号,则继续搜索左至第二个双引号。包含空格的电子邮件地址写入为
    “包含空格”@example.com

    ,而不是使用explode拆分字符串,您可能需要研究使用正则表达式拆分:

    通过这种方式,可以在一行代码中按空格、逗号或两者拆分字符串。可能看起来像这样:

    $array = preg_split('#[ |,]+#', $input);
    
    然后,您可以使用filter_var()检查每个字段,以查看哪个是电子邮件地址

    filter_var('bob@example.com', FILTER_VALIDATE_EMAIL);
    

    需要考虑的代码相当多,但您显然需要regex和explode,那么
    John,foo@corp.com
    ?这样,他们可以用空格、逗号或两者来分隔字段。