Ваше регулярное выражение - ([a-zA-Z\W+0-9]{8,})
- на самом деле ищет подстроку в большем тексте длиной не менее 8 символов, но и позволяет любые английские буквы, без слов символов (кроме [a-zA-Z0-9_]
), и цифры, так что делает не применять 2 ваших требований. Они могут быть установлены с look-aheads.
Вот фиксированное регулярное выражение:
^(?=.*\W.*)(?=.*[A-Z].*).{8,}$
На самом деле, вы можете заменить [A-Z]
с \p{Lu}
, если вы хотите, чтобы также соответствовать/разрешить не английские буквы. Вы также можете использовать \p{S}
вместо \W
или, кроме того, уточнить свой критерий special character
путем добавления символов или классов символов, например. [\p{P}\p{S}]
(это также будет включать в себя все знаки пресечения Unicode).
Усовершенствованная версия регулярных выражений:
^(?=.*[\p{S}\p{P}].*)(?=.*\p{Lu}.*).{8,}$
восприятия человеком объяснение:
^
- начало строки
(?=.*\W.*)
- Требование, чтобы иметь по крайней мере один не-слово знак
OR(?=.*[\p{S}\p{P}].*)
- По крайней мере, один специальный или пунктуации символ Unicode
(?=.*[A-Z].*)
- Требование иметь по крайней мере 1 заглавной буквы английского алфавита
ИЛИ(?=.*\p{Lu}.*)
- По крайней мере, 1 Юникода письмо
.{8,}
- требование иметь по крайней мере 8 символов
$
- Конец строки
См Demo 1 и Demo 2 (Enhanced regex)
Пример кода:
if (preg_match('/^(?=.*\W.*)(?=.*[A-Z].*).{8,}$/u', $header)) {
// PASS
}
else {
# FAIL
}
Я думаю, что сказал ОП "длиной не менее 8 символов", долго не ровно 8 символов. –
Исправлено, проверьте. –
Обычно пароли не содержат пробелов, но OP не был конкретным в этом вопросе, и об этом нет правила. –