Я не получаю желаемого эффекта от скрипта. Я хочу, чтобы пароль содержал AZ, az, 0-9 и специальные символы.
Поэтому я хочу заставить пользователя использовать как минимум 2 цифры и не менее 2 специальных символов. Хорошо, мой сценарий работает, но заставляет меня использовать цифры или символы назад. Я не хочу этого. например, пароль testABC55 $$ действителен, но я этого не хочу.
Вместо этого я хочу, чтобы тест $ ABC5 # 8 был действительным. Таким образом, в основном цифры / специальные символы могут быть одинаковыми или diff -> но должны быть разделены в строке.
PHP-код:
$uppercase = preg_match('#[AZ]#', $password); $lowercase = preg_match('#[az]#', $password); $number = preg_match('#[0-9]#', $password); $special = preg_match('#[\W]{2,}#', $password); $length = strlen($password) >= 8; if(!$uppercase || !$lowercase || !$number || !$special || !$length) { $errorpw = 'Bad Password';
Используя «читаемый» формат (его можно оптимизировать, чтобы быть короче), так как вы новичок в regex >>
^(?=.{8})(?=.*[AZ])(?=.*[az])(?=.*\d.*\d.*\d)(?=.*[^a-zA-Z\d].*[^a-zA-Z\d].*[^a-zA-Z\d])[-+%#a-zA-Z\d]+$
Добавьте свой специальный набор символов к последнему [...]
в приведенном выше регулярном выражении (теперь я ставлю только – +% # ).
Объяснение:
^ - beginning of line/string (?=.{8}) - positive lookahead to ensure we have at least 8 chars (?=.*[AZ]) - ...to ensure we have at least one uppercase char (?=.*[az]) - ...to ensure we have at least one lowercase char (?=.*\d.*\d.*\d - ...to ensure we have at least three digits (?=.*[^a-zA-Z\d].*[^a-zA-Z\d].*[^a-zA-Z\d]) - ...to ensure we have at least three special chars (characters other than letters and numbers) [-+%#a-zA-Z\d]+ - combination of allowed characters $ - end of line/string
((?=(.*\d){3,})(?=.*[az])(?=.*[AZ])(?=(.*[!@#$%^&]){3,}).{8,})
test $ ABC5 # 8 недействителен, потому что вы запрашиваете более двух цифр и специальных символов
AZ az 0-9 > 2 special chars > 2 string length >= 8
Для соответствия длины строки, включая специальные символы:
$ result = preg_match ('/ ^ (? =. [az]) (? =. [AZ]) (? =. \ d) (? =. [^ A-Za-z \ d]) [\ s \ S] {6,16} $ / ', $ string);
Ответ объяснен: https://stackoverflow.com/a/46359397/5466401