У меня есть элемент управления проверкой, который имеет следующее выражение:
(?=(.*\\d.*){2,})(?=(.*\\w.*){2,})(?=(.*\\W.*){1,}).{8,}
Это пароль как минимум с 2 цифры, 2 буквенных символа, 1 не буквенно-цифровой и Минимум 8 символов. К сожалению, это не похоже на кроссбраузерность.
Эта проверка отлично работает в Firefox, но не в Internet Explorer.
Комбинация каждого из ваших ответов приводит к:
var format = "^(?=.{" + minLength + ",})" +
(minAlpha > 0 ? "(?=(.*[A-Za-z].*){" + minAlpha + ",})" : "") +
(minNum > 0 ? "(?=(.*[0-9].*){" + minNum + ",})" : "") +
(minNonAlpha > 0 ? "(?=(.*\\W.*){" + minNonAlpha + ",})" : "") + ".*$";
EX: "^(?=.{x,})(?=(.*[A-Za-z].*){y,})(?=(.*[0-9].*){z,})(?=(.*\W.*){a,}).*$"
Важным элементом является наличие (?. {X,}) для длины первый.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Как насчет одного из существующих валидаторов надежности пароля на основе jQuery, например: http://scripts.simplythebest.net/4/Ajax-Password-Strength-Meter-software.html
Вы действительно должны проверять на стороне сервера, независимо от того, какая проверка на стороне клиента могла быть сделана. Нет никакой гарантии, что клиент сделал то, что, по вашему мнению, должно (в браузере может быть отключен javascript, клиент может даже не быть браузером).
(?=(.*\W.*){0,}) - это не 0 не буквенно-цифровых символов. Это не буквенно-цифровые символы не менее 0. Если вы хотите, чтобы пароль не содержал никаких не буквенно-цифровых символов, вы можете использовать (?!.*\W) или (?=\w*$).
Более простым решением было бы пропустить предварительный просмотр \W и использовать \w{8,} вместо .{8,}.
Также \w включает \d. Если вам нужна только альфа, вы можете использовать [^\W\d] или [A-Za-z].
/^(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})\w{8,}$/
Это подтвердит, что пароль должен содержать по крайней мере две цифры, две альфы, быть не менее 8 символов и содержать только буквенно-цифровые символы (включая подчеркивание).
\w = [A-Za-z0-9_]\d = [0-9]\s = [ \t\n\r\f\v]Редактировать: Чтобы использовать это во всех браузерах, вам, вероятно, нужно сделать что-то вроде этого:
var re = new RegExp("^(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})\\w{8,}$");
if (re.test(password)) { /* ok */ }
Edit2: Недавнее обновление вопроса почти полностью аннулирует мой ответ. ^^;;
Вы все равно сможете использовать код JavaScript в конце, если вы замените шаблон тем, что у вас было изначально.
Edit3: ОК. Теперь я понимаю, что вы имеете в виду.
/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{3,}/.test("password123") // matches
/^(?=.*[a-z].*[a-z])(?=.*[0-9].*[0-9]).{4,}/.test("password123") // does not match
/^(?=.*[a-z].*[a-z]).{4,}/.test("password123") // matches
Похоже, что (?= ) на самом деле не имеет нулевой ширины в Internet Explorer.
http://development.thatoneplace.net/2008/05/bug-discovered-in-internet-explorer-7.html
Edit4: Подробнее: http://blog.stevenlevithan.com/archives/regex-lookahead-bug
Думаю, это может решить вашу проблему:
/^(?=.{8,}$)(?=(?:.*?\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\W){1})/
new RegExp("^(?=.{8,}$)(?=(?:.*?\\d){2})(?=(?:.*?[A-Za-z]){2})(?=(?:.*?\\W){1})")
(?=.{8,}$) должен быть первым.
Да, я видел это прямо перед тем, как вы опубликовали, протестировали, и это сработало: D
Это даст вам 2-х минутные цифры, 2-х минутные символы и минимальную длину 8 символов ... Я отказываюсь показать вам, как запретить пользователям использовать не буквенно-цифровые символы в своих паролях, почему сайты хотят применять менее безопасные пароли?
^(?=.*\d{2})(?=.*[a-zA-Z]{2}).{8,}$
Ха-ха, я согласен: P 0 был там, потому что он установлен на стороне сервера (это минимум, а не `` у вас может быть 0 не буквенно-цифровых '')
Каким образом использование не буквенно-цифровых символов делает пароль менее безопасным?
[Перечитать] ".. Я отказываюсь показать вам, как нет позволяет пользователям использовать не буквенно-цифровые символы"
Не хорошо. Затем ему нужно будет снова проверить серверную часть и дважды поддерживать логику.