2017-03-02 121 views
1

我用jquery的验证器validation.I有50名免费的电子邮件等(gmail.com,yahoo.com),所以我需要验证它。我选择阵列然后将其存储在阵列中的所有电子邮件。下面看看我的代码有,你可以看到我用普通expression.I正则表达式传递一个变量,但它不工作的me.It扔错误这样语法错误:无效的范围在字符类JQuery验证自由使用的电子邮件验证

我代码

$.validator.addMethod('nofreeemail', function (value) { 
    var emails = ["gmail.com","yahoo.com","hotmail.com"] 
    $.each(emails,function(i, val){ 
    console.log("email", val) 
    var regex = new RegExp("/^([\w-.][email protected](?!"+val+")([\w-]+.)+[\w-]{2,4})?$/"); 
    console.log("regex", regex) 
    return regex.test(value); 
    }); 
}, 'Free email addresses are not allowed.'); 
+3

既然你不关心的电子邮件地址的第一部分,你为什么不把它分成'@'并且检查第二部分是否与你的免费主机列表相对? – cybrox

+0

从构造函数表示法中移除正则表达式分隔符。你正在传递一个字符串字面模式,而不是正则表达式。并且双反斜杠和'val':'var regex = new RegExp(“^([\\ w - 。] + @(?!”+ val.replace(/ [ - \/\\^$ $ * +? 。()| [\] {}]/g,'\\ $&')+“)([\\ w - ] + \\。)+ [\\ w - ] {2,4})?$ “);'。我也相信'([\ w - ] +。)+'中的点必须被转义,它应该匹配一个文字点,对吧? –

+0

为什么不'VAR正则表达式=新的RegExp( “/ ^([\ w - ] + @” + VAL + “$ /”);?' – VadimB

回答

2

我会发布一个答案,因为它不是明显的发生了什么事情,但underl因为理由相当普遍。

您正在使用一个构造函数符号来定义正则表达式。当需要使用变量动态构建模式时,这是一种正确的方法。但是,文字反斜杠必须写为"\\"。所有单个反斜杠都被删除。因此,由于[\w-.]变为[w-.],所以出现错误,并且它是无效的字符类。此外,正则表达式分隔符(模式周围的那些/..../)绝不应在构造函数表示法中使用,除非您确实需要匹配由/包围的字符串。

此外,您emails包含非字字符,你需要躲避他们的。

使用

var regex = new RegExp("^([\\w-.][email protected](?!"+val.replace(/[-\/\\^$*+?.()|[\]{}]/g,'\\$&')+")([\\w-]+\\.)+[\\w-]{2,4})?$"); 

我也相信在([\w-]+.)+点必须转义,它应该匹配一个点,

+0

非常感谢,它工作正常。 – Karthick