Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript获取字符串中的所有电子邮件地址_Javascript_Regex_Validation - Fatal编程技术网

使用JavaScript获取字符串中的所有电子邮件地址

使用JavaScript获取字符串中的所有电子邮件地址,javascript,regex,validation,Javascript,Regex,Validation,我有一个JavaScript函数: ME.Utils = { RxEmail: new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25

我有一个JavaScript函数:

ME.Utils = {
    RxEmail: new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i),

    ValidateEmail: function(email) {
        return ME.Utils.RxEmail.test(email);
    },

    GetEmailAddresses: function(text) {
        return text.match(ME.Utils.RxEmail);
    },

    HasEmail: function(text) {
        return ME.Utils.GetEmailAddresses != null;
    }
};
ValidateEmail
非常有效。但是,
HasEmail
GetEmailAddresses
工作不正常

getEmailAddresss
始终返回
null
,除非字符串仅包含电子邮件地址。在本例中,
getEmailAddresss
返回一个数组,该数组不仅包含电子邮件地址,还包含电子邮件地址(test@test.com),只是身份证(测试)加上一些身份不明的东西等等


您能帮我找出表达式中的错误吗?

在使用电子邮件地址显示数组时,数组中出现多个条目的原因是表达式中有捕获组。在Javascript中,匹配的结果是一个数组,其中索引0是匹配的总字符串,然后每个捕获组都有(可选)额外的索引。通过将组从
(…)
更改为
(?:…)
,可以使组不被捕获

if (emailMatch = ME.Utils.GetEmailAddresses(myEmail))
  // do stuff with emailMatch[1]
至于在使用包含电子邮件地址的字符串的
GetEmailAddresses
时,为什么没有得到预期的结果,请尝试以下方法:

GetEmailAddresses: function(text) {
    var rv = [];
    var match;

    while (match = ME.Utils.RxEmail.exec(text)) {
        rv.push(match[0]);
    }
    return rv.length == 0 ? null : rv;
},
看到这一点,我不能说我知道为什么
String#match
与上面的
RegExp#exec
循环不完全相同,但事实并非如此


编辑,您还需要解决该问题;需要允许RegExp匹配子字符串。

在使用电子邮件地址呈现数组时,数组中会出现多个条目的原因是表达式中有捕获组。在Javascript中,匹配的结果是一个数组,其中索引0是匹配的总字符串,然后每个捕获组都有(可选)额外的索引。通过将组从
(…)
更改为
(?:…)
,可以使组不被捕获

至于在使用包含电子邮件地址的字符串的
GetEmailAddresses
时,为什么没有得到预期的结果,请尝试以下方法:

GetEmailAddresses: function(text) {
    var rv = [];
    var match;

    while (match = ME.Utils.RxEmail.exec(text)) {
        rv.push(match[0]);
    }
    return rv.length == 0 ? null : rv;
},
看到这一点,我不能说我知道为什么
String#match
与上面的
RegExp#exec
循环不完全相同,但事实并非如此


编辑,您还需要解决该问题;需要允许RegExp匹配子字符串。

您的RegExp专门匹配整个字符串

RxEmail: new RegExp(/^ ... $)/i),

^和$分别匹配输入的开始和结束。试着删除这些字符,看看你的情况如何?

你的regexp专门匹配整个字符串

RxEmail: new RegExp(/^ ... $)/i),

^和$分别匹配输入的开始和结束。试着删除这些角色,看看你过得怎么样?

有一些问题

  • 正则表达式锚定在字符串的开头和结尾。您应该从中删除
    ^
    $
    字符

  • 如果只想返回电子邮件地址,请使用非捕获组

  • HasEmail()
    中,您没有调用
    GetEmailAddresses()
    。实际上,您正在检查该属性的值是否已定义

  • 总而言之,固定版本可能如下所示:

    ME.Utils = {
        RxEmail: /(?:(?:"[\w-\s]+")|(?:[\w-]+(?:\.[\w-]+)*)|(?:"[\w-\s]+")(?:[\w-]+(?:\.[\w-]+)*))(?:@(?:(?:[\w-]+\.)*\w[\w-]{0,66})\.(?:[a-z]{2,6}(?:?:\.[a-z]{2})?))|(?:@\[?(?:(?:25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?)/gi,
    
        ValidateEmail: function(email) {
            // We can't do a simple test() since we're using an unanchored regex now.
            var match = ME.Utils.RxEmail.match(email);
            return match.length == 1 && match[0] == email;
        },
    
        GetEmailAddresses: function(text) {
            return text.match(ME.Utils.RxEmail);
        },
    
        HasEmail: function(text) {
            return ME.Utils.GetEmailAddresses(text) != null;
        }
    };
    

    有几个问题

  • 正则表达式锚定在字符串的开头和结尾。您应该从中删除
    ^
    $
    字符

  • 如果只想返回电子邮件地址,请使用非捕获组

  • HasEmail()
    中,您没有调用
    GetEmailAddresses()
    。实际上,您正在检查该属性的值是否已定义

  • 总而言之,固定版本可能如下所示:

    ME.Utils = {
        RxEmail: /(?:(?:"[\w-\s]+")|(?:[\w-]+(?:\.[\w-]+)*)|(?:"[\w-\s]+")(?:[\w-]+(?:\.[\w-]+)*))(?:@(?:(?:[\w-]+\.)*\w[\w-]{0,66})\.(?:[a-z]{2,6}(?:?:\.[a-z]{2})?))|(?:@\[?(?:(?:25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?)/gi,
    
        ValidateEmail: function(email) {
            // We can't do a simple test() since we're using an unanchored regex now.
            var match = ME.Utils.RxEmail.match(email);
            return match.length == 1 && match[0] == email;
        },
    
        GetEmailAddresses: function(text) {
            return text.match(ME.Utils.RxEmail);
        },
    
        HasEmail: function(text) {
            return ME.Utils.GetEmailAddresses(text) != null;
        }
    };
    

    不是很有帮助。我需要获取一个字符串中包含所有电子邮件地址的数组,如[”test@test.com", "sth@sth.com", etc@etc.com“]”。现在GetEmailAddresses返回一个充满垃圾邮件的数组。这不是很有帮助。我需要获取一个包含字符串中所有电子邮件地址的数组,如[”test@test.com", "sth@sth.com", etc@etc.com"]. 现在GetEmailAddresses返回一个满是垃圾的数组。哦,看。有人试图用正则表达式测试电子邮件地址。我最后一次看到成功的是什么时候?今天不行,它拒绝包含+字符的电子邮件地址。请停止嘲笑我。帮帮我,或者什么都不说…@odeo,没那么简单。看到了吗,即使是那个怪物,也需要先对一些问题进行剥离,这些问题是关于定期使用regex cropup解析电子邮件地址的,而且它们通常对常见的地址样式有错误的否定。我不是在嘲弄你,我是在表达人们未能从历史中吸取教训并一次又一次犯同样错误的沮丧。正则表达式不适合解析任何深度的电子邮件地址,但人们坚持一次又一次地尝试并失败。雅虎!是一家大型公司,他们的业务是建立在网络的基础上的,但他们做不好:-但是很多小鱼认为他们可以。@h2g2java:每隔几天试试:哦,看。有人试图用正则表达式测试电子邮件地址。我最后一次看到成功的是什么时候?今天不行,它拒绝包含+字符的电子邮件地址。请停止嘲笑我。帮帮我,或者什么都不说…@odeo,没那么简单。看到了吗,即使是那个怪物,也需要先对一些问题进行剥离,这些问题是关于定期使用regex cropup解析电子邮件地址的,而且它们通常对常见的地址样式有错误的否定。我不是在嘲弄你,我是在表达人们未能从历史中吸取教训并一次又一次犯同样错误的沮丧。正则表达式不适合解析任何深度的电子邮件地址,但人们坚持一次又一次地尝试并失败。雅虎!是一家大型公司,他们的业务是建立在网络上的,但他们做不好:-但很多小鱼认为他们可以。@h2g2java:每隔几天试试:谢谢。除此之外,你的答案更完整,所以