2013-07-16 34 views
2

Regula,我怎麼能有一個不符合模式的約束?我可以用@Pattern這樣的:檢查一個模式不匹配

<input type="text" id="categoryId" data-constraints="@Pattern(regex=/[0-9]-[A-Z]{3}-[0-9]{4}/)" /> 

但是,讓我們說,/[0-9]-[A-Z]{3}-[0-9]{4}/是一個「壞」的模式,我想允許他們進入任何匹配模式。

在常規的JavaScript我可以這樣做:

if(!/[0-9]-[A-Z]{3}-[0-9]{4}/.test(value)) { 
    ... 
} 

我怎麼能做到這一點的古拉?

回答

2

有幾種方法可以做到這一點。對於你的情況,你可以使用負前瞻:

<input type="text" id="categoryId" data-constraints="@Pattern(regex=/^(?!.*[0-9]-[A-Z]{3}-[0-9]{4})/)" /> 

我不知道怎麼說的更復雜的正則表達式的作品,但如果是這樣的話,我想你可以創建一個自定義的約束:

regula.custom({ 
    name: "NotPattern", 
    params: ["regex"], 
    defaultMessage: "The value must not match {regex}.", 
    validator: function(params) { 
     var regex = new RegExp(params["regex"]); 
     return !regex.test(this.value); 
    } 
}); 

你甚至可以推遲到內置@Pattern驗證您的驗證功能,像這樣:

regula.custom({ 
    name: "NotPattern", 
    params: ["regex"], 
    defaultMessage: "The value must not match {regex}.", 
    validator: function(params, validator) { 
     return !validator.pattern(this, params);    
    } 
}); 

然後你可以使用它在您輸入元素,像這樣:

<input type="text" id="categoryId" data-constraints="@NotPattern(regex=/[0-9]-[A-Z]{3}-[0-9]{4}/)" /> 

我建議第二種方法,因爲你可以在該內置@Pattern驗證支持,像flags的正則表達式標誌參數傳遞。這也是內置驗證器的正確反例。

編輯:我認爲這可能是有用的,添加一個可選參數@Pattern,以便您可以反轉模式。所以基本上(假設此功能已實現的)所有你必須做的是這樣的:

<input type="text" id="categoryId" data-constraints="@Pattern(regex=/[0-9]-[A-Z]{3}-[0-9]{4}/, invert=true)" /> 

我會把這個我要做的事情就行了。

+0

工作正常!非常感謝!! –