2013-07-16 3 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 для регулярных выражений флагов. Это также является правильным обратным для встроенного валидатора.

EDIT: Я думаю, было бы полезно добавить необязательный параметр в @Pattern, чтобы вы могли инвертировать шаблон. Таким образом, в основном (предполагая, что эта функция была реализована) все, что вы должны сделать, это:

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

Я помещу это в моем списке вещей, чтобы сделать.

+0

Это работает! Огромное спасибо!! –

Смежные вопросы