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

时间:2011-10-29 17:46:52

标签: 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

目前我的解决方案是explode \n然后用逗号分解,然后猜测电子邮件和名称的位置。我承认这完全不可靠,这就是为什么我想看看其他人如何处理这个问题。

我想要的数组就像:

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

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

而不是使用explode来分割字符串,您可能需要考虑使用正则表达式分割:

http://www.php.net/manual/en/function.preg-split.php

这样,您可以在一行代码中按空格,逗号或两者分割字符串。可能看起来像这样:

$array = preg_split('#[ |,]+#', $input);

然后,您可以使用filter_var()检查每个字段,以查看哪个是电子邮件地址。

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

http://www.php.net/manual/en/function.filter-var.php

答案 1 :(得分:0)

可以尝试这样做:

  1. 逐行读取文件(是文件吗?还是只是一串文字?)
  2. 按空间爆炸。
  3. 对于从爆炸功能生成的每个阵列,验证它是否是电子邮件地址(例如,使用this function)如果它有效,那么您知道它是电子邮件地址,否则就是这个名字。
  4. 你也可以"清洁"名称(例如删除",")

答案 2 :(得分:0)

嗯,这是我提出的一个总体想法:

  1. 在行中搜索 last @字符(如果有人使用包含@的愚蠢名称,因为人们喜欢这样做)。电子邮件只能包含一个@符号;如果它包含多个,则不会是有效的电子邮件。
  2. 找到@符号左侧的第一个空格。虽然电子邮件地址可能包含空格,但大多数电子邮件服务器处理错误,许多电子邮件提供商禁止首先使用空间,因此通常可以安全地说没有电子邮件地址会包含空格
  3. 将该字符串中的字符串拆分为两个(您可以简单地使用substr(),从0到该字符的位置,然后该字符的位置加1到结尾)。您将获得所有名称的第一部分,其中可能包含名字,姓氏或其他信息。第二部分是电子邮件地址。如果@符号左边没有空格,那么你可以暗示没有给出任何名字。
  4. 修剪两个字符串开头和结尾的多余空格和逗号(为了安全起见)。
  5. 您应该使用正则表达式验证电子邮件地址部分是否实际格式化为电子邮件地址。
  6. 如果您[真的]想要添加对空格字符的支持,您可以随时查看@符号左侧的字符,如果是双引号,则继续向左搜索第二个双引号。包含空格的电子邮件地址为"contains a space"@example.com