2017-03-02 40 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