如何在JavaScript中从字符串中找到电子邮件和姓名

4
我正在使用一个很酷的小部件从Gmail / Hotmail / Yahoo等邮箱中导入电子邮件地址。该小部件仍处于测试版,我猜这就是它不允许进行大量配置的原因。实际上,它只是用以下数据填充了一个文本区域:
"Name one" <foo@domain.com>, "Name Two" <foo@domain.com>, "And so on" <andsoon@gmx.net>
所以我想知道是否有人可以帮助我编写一个正则表达式或类似的东西,以将字符串中的所有值提取到一个数组中。期望的格式应为:
[{name: 'Name one', email: 'foo@domain'},{name: 'Name Two', email: 'foo@domain'},{name: 'And so on', email: 'andsoon@gmx.net'}]
我是一个完全不懂正则表达式的新手,也不知道如何在JavaScript中实现。感谢您的帮助!

请注意,解析电子邮件地址通常非常复杂。如果您试图欺骗,您将在上线后约15分钟内找到一些具有破坏您正则表达式的电子邮件地址的合法用户 :-) - Pointy
很抱歉,我表述问题有点错误:检查电子邮件地址是否正确并不重要。小部件只会返回有效的电子邮件。我不明白的是如何获取数据对(姓名+电子邮件)。我想知道""里面是什么=>姓名,<>里面是什么=电子邮件。string.match一次只能找到一个,对吗? - Marc
即使您不检查电子邮件地址的有效性,这也会很棘手。首先,每个地址的引号“名称”部分内可能有逗号。如果是我,我会花费精力尝试找出如何以编程友好的方式获取我的“酷炫小部件”中的电子邮件地址。 - Pointy
3个回答

11
function getEmailsFromString(input) {
  var ret = [];
  var email = /\"([^\"]+)\"\s+\<([^\>]+)\>/g

  var match;
  while (match = email.exec(input))
    ret.push({'name':match[1], 'email':match[2]})

  return ret;
}

var str = '"Name one" <foo@domain.com>, ..., "And so on" <andsoon@gmx.net>'
var emails = getEmailsFromString(str)


全局标志会在多次运行此方法时引起问题。你会发现它第一次可以正常工作,第二次失败,第三次又可以正常工作。 - dparnas
@dparnas,这就是为什么我在函数内部定义正则表达式的原因...下次运行函数时,您将获得一个新的正则表达式实例。如果它在函数外部定义,您提到的行为将发生。 - Tracker1
@tracker1 即使在函数内定义正则表达式,仍然遇到了问题。但这是一个 Google Apps Script,可能是原因。 - dparnas

3
function findEmailAddresses(StrObj) {
        var separateEmailsBy = ", ";
        var email = "<none>"; // if no match, use this
        var emailsArray = StrObj.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/gi);
        if (emailsArray) {
            email = "";
            for (var i = 0; i < emailsArray.length; i++) {
                if (i != 0) email += separateEmailsBy;
                email += emailsArray[i];
            }
        }
        return email;
    }

Source here


1
如果我的电子邮件地址是Håkan.Söderström@malmö.se?;-)(请参见:http://stackoverflow.com/questions/3232/how-far-should-one-take-e-mail-address-validation/300862#300862)此外,请不要忘记“+”是名称的有效字符。 Gmail用户喜欢使用with me+label@gmail.com过滤他们的电子邮件。 - Sean Vieira
话虽如此,我认为没有任何正则表达式完全适用于这个特定的目的,但我认为这个答案确实展示了从任意字符串中提取电子邮件的操作理论。 - karim79
非常抱歉,我有点表述不清楚:检查电子邮件地址是否正确并不重要。小部件只会返回有效的电子邮件地址。我不明白如何获取数据对(姓名+电子邮件)。我想知道在""中是什么=> 姓名,在<>中是什么= 电子邮件。string.match一次只能找到一个,是吗? - Marc

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接