Отказ специальных символов jQuery Validate

Мне нужно проверить текстовое поле с помощью плагина 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\-\=\~\[email protected]#\%&\*\(\)_\+\\\/<>\?\{\}\.\$‘\^\+\"\';:,\s]/
}

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

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

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

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

Ответ 1

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

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

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

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

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


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

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

Объяснение

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  [A-Za-                   any character of: 'A' to 'Z', 'a' to 'z',
  z\s`[email protected]#$%^&*()+={}|     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!