如何从文本中解析/修剪电子邮件地址

6
类似于这个问题,但是我不确定如何在这种情况下实现。
一个可信赖的用户(无需验证输入)正在将电子邮件地址键入/粘贴到文本字段中。在失去焦点事件上,我想查看文本并清理他输入的任何内容(通常在从电子邮件客户端复制和粘贴地址列表后)。 "Bob Smith" <bob@company.com>, joe@company.com, "John Doe"<john@company.com> 将被修剪为: bob@company.com, joe@company.com, john@company.com
5个回答

6
这个正则表达式应该可以删除双引号以及 <> 字符。
/".*?"|[<>]/

在Javascript中,你可能会有以下代码:
line.replace(/".*?"|[<>]/g, '');

这并不重要。上面的正则表达式将删除任何存在的尖括号。对于没有被尖括号包围的电子邮件地址,不会发生任何事情。 - Mark Biek
抱歉,我看漏了这是 JavaScript 而不是 PHP。我已经更新为 JavaScript 版本。 - Mark Biek
@Mark,我必须承认,我最喜欢这个答案;然而,我发现一些客户端(例如gmail的Web界面)不会在引号中放置人名 John Doe <john@company.com>,因此我决定采用稍微更强大一些的版本,即@Jonathan的答案。 - snumpy
没问题 :) 无论哪个答案最彻底地解决了你的问题,都可以。 - Mark Biek
@snumpy,随意对我的答案进行编辑以反映您的修订。谢谢。 - Jonathan M

3
var emailList = userInput
    .replace(/[^,;]*.?</g, "")
    .replace(/>/g, "")
    .replace(/[,; ]{1,}/g, "\n")
    .replace(/[\n]{2,}/g, "\n")
    .split("\n")

这使得电子邮件列表可以以以下格式提供(包括从Google To框中复制和粘贴电子邮件列表):
"Bob Rob"<bob@company.com>, job@company.com; rob@company.com job@somewhere.com

电子邮件地址可以用逗号,、分号;或换行符隔开。

3

有效的电子邮件地址可能非常奇怪,因此我建议不要在该字段中禁止任何内容,否则您的程序可能无用,因为用户将无法向有效的电子邮件地址发送电子邮件。

要阅读整个故事,请查看此博客文章或自己查看RFC。


2
我的印象是,这不是所有用户都会面对的表单。相反,这是一个单个人正在使用的表单,用于批量输入大量数据。因此,虽然我认为你提出了很好的观点,但我不知道这是否是一个问题。 - Mark Biek
也许你是对的,但是程序员很容易被骗写出恶心的软件,而这只会给用户带来烦恼。有时候过于复杂的逻辑会导致智能软件存在问题,特别是当它聪明却不足以正确处理时,而且没有办法绕过和禁用这种半聪明状态。 - 6502

2
你可以使用.math()方法快速将电子邮件解析成数组:
inputval.match(/[A-z0-9]+@[A-z0-9]+.[A-z]{2,3}/g)

如果你想把它转换成字符串,你可以在其中添加.join(',').join(';')。这个正则表达式已经被简化了。有许多正则表达式可以解析电子邮件,但上面的这个是一个简化版本。它没有考虑子域名,如下面的评论所指出的,也没有考虑多部分TLD(它还没有考虑电子邮件地址的第一部分中的+符号)。请用符合您需求的正则表达式进行替换。

不匹配 Blow@example.coms.co.nr - Code Guy
@CodeGuy 你说得对。我确实注意到这个正则表达式非常简化。电子邮件的正则表达式非常容易取代我上面的表达式。我没有清楚地传达的重点是,.match将返回匹配项。这是一种轻松解析简单电子邮件地址的方法,这也是OP所问的。虽然我鼓励其他人编辑我的答案,如果他们能改进它们,但精确的正则表达式并不是我回答的重点。无论如何,如果您想添加更好的正则表达式来改进我在此处的内容,请随意这么做。 - Joseph Marikle

-2
myEmailList=userInput.match(/[a-zA-z0-9_.]+@[a-zA-Z0-9_.]+\.(com|org|whatever)/g);
myEmailListString=myEmailList.join(', ');

如果你只想要一个电子邮件地址的数组,那么只需执行第一行代码即可。


6
请不要自己制定正则表达式来解析电子邮件地址。说真的?(com|org|随便什么)? - Alan H.
2
是的,“whatever”只是一个占位符,用于插入他想要的任何顶级域名。虽然,在新规定和几十万美元的情况下,“whatever”可以成为一个顶级域名。 :) - Jonathan M
4
没错,我不是不理解“无所谓”的意思,只是我强烈反对这种做法。 - Alan H.
3
此外,这个表达式甚至无法匹配一些有效的地址。请不要做这种无用的事情。 - Alan H.
4
放松,伙计。这里有足够的空间可以添加你的答案。 - Jonathan M
找出那个使得许多网站允许无效地址而禁止有效地址的问题。 - Gustavo Rodrigues

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