Отказ от специальных символов JQuery Validate - PullRequest
10 голосов
/ 17 ноября 2011

Мне нужно проверить текстовое поле с помощью плагина jQuery Validate, для этого я использую регулярное выражение и добавляю метод к плагину:

$.validator.addMethod(
    "regex",
    function(value, element, regexp) {
        var check = false;
        var re = new RegExp(regexp);
        return this.optional(element) || re.test(value);
    },
    "No special Characters allowed here. Use only upper and lowercase letters (A through Z; a through z), numbers and punctuation marks (. , : ; ? ' ' \" - = ~ ! @ # $ % ^ & * ( ) _ + / < > { } )"
);

Затем в опциях добавляю регулярное выражение:

comments:{
    required: true,
    maxlength: 8000,
    regex: /[^A-Za-z\d\-\=\~\!@#\%&\*\(\)_\+\\\/<>\?\{\}\.\$‘\^\+\"\';:,\s]/
}

Это «работает» определенным образом, оно обнаруживает недопустимые символы и отображает сообщение, проблема в том, что он работает только тогда, когда в поле присутствуют только специальные символы, например:

| `` ° ¬ // This shows the error message but...
test | // This won't show the message

Так что, если есть один разрешенный символ, проверка просто перестает работать. Я что-то упустил?

P.S. Я почти уверен, что это как-то связано с плагином, потому что я протестировал регулярное выражение только с помощью javascript, и он хорошо работает.

1 Ответ

14 голосов
/ 17 ноября 2011

вместо проверки на наличие специальных символов, проверяйте только на наличие допустимых символов

regex: /^[A-Za-z\d=#$%...-]+$/

Замените ... всеми специальными символами, которые вы хотите разрешить. В приведенном выше примере допускаются #, $, % и -. Примечание: вам не нужно экранировать (большинство) символов внутри [].

Если вы хотите разрешить -, это должен быть последний символ, в противном случае регулярное выражение пытается проанализировать диапазон. (например, [a-c] соответствует a, b и c. [a-c-] соответствует a, b, c и -)

Кроме того, если вы хотите разрешить ^, он не может быть первым символом, в противном случае регулярное выражение рассматривает это как своего рода оператор not. (например, [^abc] соответствует любому символу, который не является a, b или c)


В приведенном выше примере полное регулярное выражение может выглядеть примерно так

regex: /^[A-Za-z\s`~!@#$%^&*()+={}|;:'",.<>\/?\\-]+$/

Объяснение

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  [A-Za-                   any character of: 'A' to 'Z', 'a' to 'z',
  z\s`~!@#$%^&*()+={}|     whitespace (\n, \r, \t, \f, and " "), '`',
  ;:'",.<>/?\\-]+          '~', '!', '@', '#', '$', '%', '^', '&',
                           '*', '(', ')', '+', '=', '{', '}', '|',
                           ';', ':', ''', '"', ',', '.', '<', '>',
                           '/', '?', '\\', '-' (1 or more times
                           (matching the most amount possible))
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

check it out!

...