使用jQuery从批量文本中提取所有电子邮件地址

45

我有以下文本:

sdabhikagathara@rediffmail.com, "assdsdf" <dsfassdfhsdfarkal@gmail.com>, "rodnsdfald ferdfnson" <rfernsdfson@gmail.com>, "Affdmdol Gondfgale" <gyfanamosl@gmail.com>, "truform techno" <pidfpinfg@truformdftechnoproducts.com>, "NiTsdfeSh ThIdfsKaRe" <nthfsskare@ysahoo.in>, "akasdfsh kasdfstla" <akashkatsdfsa@yahsdfsfoo.in>, "Bisdsdfamal Prakaasdsh" <bimsdaalprakash@live.com>,; "milisdfsfnd ansdfasdfnsftwar" <dfdmilifsd.ensfdfcogndfdfatia@gmail.com>

这里的电子邮件地址用,;分隔。 我想提取所有出现的电子邮件地址并将它们存储在一个数组中。有没有使用正则表达式直接获取所有电子邮件地址的简单方法?


嗯,根据您的示例,“这里电子邮件由'或';'分隔。”似乎是无效的语句。您可能是想说“,”和/或“;”吗? - Mark Schultheiss
@MarkSchultheiss:查看 Gmail 的收件人、抄送和密送列表。在那里用逗号或分号分隔电子邮件地址是完全有效的。 - Milind Anantwar
是的,但你说了一个单引号/撇号,这与你的示例数据不匹配。 - Mark Schultheiss
哇哦......我的错。现在已经编辑好了。 - Milind Anantwar
我已经编写了一个库,用于从任意文本中提取电子邮件 https://github.com/gajus/extract-email-address - Gajus
8个回答

106

以下是您可以采用的方法:

HTML

<p id="emails"></p>

JavaScript(JavaScript)

var text = 'sdabhikagathara@rediffmail.com, "assdsdf" <dsfassdfhsdfarkal@gmail.com>, "rodnsdfald ferdfnson" <rfernsdfson@gmal.com>, "Affdmdol Gondfgale" <gyfanamosl@gmail.com>, "truform techno" <pidfpinfg@truformdftechnoproducts.com>, "NiTsdfeSh ThIdfsKaRe" <nthfsskare@ysahoo.in>, "akasdfsh kasdfstla" <akashkatsdfsa@yahsdfsfoo.in>, "Bisdsdfamal Prakaasdsh" <bimsdaalprakash@live.com>,; "milisdfsfnd ansdfasdfnsftwar" <dfdmilifsd.ensfdfcogndfdfatia@gmail.com> datum eternus hello+11@gmail.com';    

function extractEmails (text)
{
    return text.match(/([a-zA-Z0-9._+-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/gi);
}
     
$("#emails").text(extractEmails(text).join('\n'));

结果

sdabhikagathara@rediffmail.com,dsfassdfhsdfarkal@gmail.com,rfernsdfson@gmal.com,gyfanamosl@gmail.com,pidfpinfg@truformdftechnoproducts.com,nthfsskare@ysahoo.in,akashkatsdfsa@yahsdfsfoo.in,bimsdaalprakash@live.com,dfdmilifsd.ensfdfcogndfdfatia@gmail.com,hello+11@gmail.com

来源:从批量文本中提取电子邮件(使用正则表达式、JavaScript和jQuery)

此处查看演示 1

此处查看演示 2 使用 jQuery 的 each 迭代函数


@感谢leniel...我一直在期待能够使用jQuery迭代器来处理所有的电子邮件。演示2对我来说非常有效。 - Milind Anantwar
它不应该是这样写的吗 extractEmails($("#emails").text()).join('\n'); 或者我漏掉了什么? - notacouch
啊,好的,我不知道怎么错过了第一行 var text = ...,可能是因为我以为它是从段落中提取的(然后写回去或者其他什么)。谢谢! - notacouch
请翻译以下有关编程的内容从英语到中文。只返回翻译后的文本:请避免此答案,因为它不会解析这个有效的电子邮件“hello+11@gmail.com”。 - GorvGoyl
@GoryGoyl:刚刚更新了正则表达式以匹配带有+字符的电子邮件。演示1已经可以工作了:http://jsfiddle.net/leniel/VS7Qe/915/。感谢您的评论。 - Leniel Maccaferri
将以下与编程有关的内容从英语翻译成中文。仅返回翻译后的文本:这种方法在电子邮件结尾处包含(.)。 - huykon225

14

你可以使用这个正则表达式:

var re = /(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/g;

你可以像这样提取电子邮件:

('sdabhikagathara@rediffmail.com, "assdsdf" <dsfassdfhsdfarkal@gmail.com>, "rodnsdfald ferdfnson" <rfernsdfson@gmail.com>, "Affdmdol Gondfgale" <gyfanamosl@gmail.com>, "truform techno" <pidfpinfg@truformdftechnoproducts.com>, "NiTsdfeSh ThIdfsKaRe" <nthfsskare@ysahoo.in>, "akasdfsh kasdfstla" <akashkatsdfsa@yahsdfsfoo.in>, "Bisdsdfamal Prakaasdsh" <bimsdaalprakash@live.com>,; "milisdfsfnd ansdfasdfnsftwar" <dfdmilifsd.ensfdfcogndfdfatia@gmail.com>').match(re);

//["sdabhikagathara@rediffmail.com", "dsfassdfhsdfarkal@gmail.com", "rfernsdfson@gmail.com", "gyfanamosl@gmail.com", "pidfpinfg@truformdftechnoproducts.com", "nthfsskare@ysahoo.in", "akashkatsdfsa@yahsdfsfoo.in", "bimsdaalprakash@live.com", "dfdmilifsd.ensfdfcogndfdfatia@gmail.com"]

13

更新已接受答案。此方法不适用于电子邮件地址中的“加号”。GMAIL支持emailaddress+randomtext@gmail.com。

我已更新为:

return text.match(/([a-zA-Z0-9._+-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/gi);

如果我的文本是"lasdkfs.sk@gmail.com. laks lka",那么它将在末尾包含(.)。 - huykon225

3
下面的函数符合RFC2822标准,参考Regexr.com
ES5:
var extract = function(value) {
   var reg = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/g;
   return value && value.match(reg);
}

ES6:

const reg = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/g
const extract = value => value && value.match(reg)

Regexr社区源代码


2

2
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)

Source


1
 const = regex = /\S+[a-z0-9]@[a-z0-9\.]+/img
"hello sean@example.com how are you? do you know bob@example.com?".match(regex)

被低估的回应! - 4umfreak

0
这里的一堆答案包括大小写字母 [a-zA-Z] 和不敏感的正则表达式标志 i,这是无意义的。
  • i 修饰符:不区分大小写。不区分大小写匹配(忽略 [a-zA-Z] 的大小写)。
  • \d 匹配数字(等同于 [0-9])。因为域名扩展名不以数字字符结尾)。

因此,与 \d 标记相结合,我们得到了一个更加简洁和优雅的句子。

/[a-z\d._+-]+@[a-z\d._-]+/gi

演示

let input = 'sdabhikagathara@rediffmail.com, "assdsdf" <dsfassdfhsdfarkal@gmail.com>, "rodnsdfald ferdfnson" <rfernsdfson@gmail.com>, "Affdmdol Gondfgale" <gyfanamosl@gmail.com>, "truform techno" <pidfpinfg@truformdftechnoproducts.com>, "NiTsdfeSh ThIdfsKaRe" <nthfsskare@ysahoo.in>, "akasdfsh kasdfstla" <akashkatsdfsa@yahsdfsfoo.in>, "Bisdsdfamal Prakaasdsh" <bimsdaalprakash@live.com>,; "milisdfsfnd ansdfasdfnsftwar" <dfdmilifsd.ensfdfcogndfdfatia@gmail.com>'

function get_email(string) {
  return string.match(/[a-z\d._+-]+@[a-z\d._-]+/gi)
};

$('#output').html(get_email(input).join('; '));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="output"></div>


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