2015-04-24 3 views
2

я пытаюсь написать регулярное выражение в PHP для обеспечения пароль соответствует критериям, который:Пароль Регулярное выражение с четырьмя критериями

  • Он должен по крайней мере 8 символов
  • Он должен включать в себя по крайней мере один специальный знак
  • Он должен содержать хотя бы одну заглавную букву.

Я написал следующее выражение:

$pattern=([a-zA-Z\W+0-9]{8,}) 

Однако, это не похоже на работу в соответствии с перечисленными критериями. Могу ли я получить еще пару глаз, чтобы помочь мне, пожалуйста?

ответ

4

Ваше регулярное выражение - ([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 
} 
+1

Я думаю, что сказал ОП "длиной не менее 8 символов", долго не ровно 8 символов. –

+0

Исправлено, проверьте. –

+0

Обычно пароли не содержат пробелов, но OP не был конкретным в этом вопросе, и об этом нет правила. –

2

Используя положительный lookahead?= мы уверены, что все требования к паролю будут выполнены.


Требования к сильным паролем:

По крайней мере 8 символов длиной
По крайней мере, 1 заглавная буква
По крайней мере один специальный символ


Regex:

^((?=[\S]{8})(?:.*)(?=[A-Z]{1})(?:.*)(?=[\p{S}])(?:.*))$ 

PHP реализация:

if (preg_match('/^((?=[\S]{8})(?:.*)(?=[A-Z]{1})(?:.*)(?=[\p{S}])(?:.*))$/u', $password)) { 
    # Strong Password 
} else { 
    # Weak Password 
} 

Примеры:

12345678 - WEAK 
1234%fff - WEAK 
1234_44A - WEAK 
133333A$ - STRONG 

Regex Объяснение:

^ assert position at start of the string 
1st Capturing group ((?=[\S]{8})(?:.*)(?=[A-Z]{1})(?:.*)(?=[\p{S}])(?:.*)) 
    (?=[\S]{8}) Positive Lookahead - Assert that the regex below can be matched 
     [\S]{8} match a single character present in the list below 
      Quantifier: {8} Exactly 8 times 
      \S match any kind of visible character [\P{Z}\H\V] 
    (?:.*) Non-capturing group 
     .* matches any character (except newline) [unicode] 
      Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy] 
    (?=[A-Z]{1}) Positive Lookahead - Assert that the regex below can be matched 
     [A-Z]{1} match a single character present in the list below 
      Quantifier: {1} Exactly 1 time (meaningless quantifier) 
      A-Z a single character in the range between A and Z (case sensitive) 
    (?:.*) Non-capturing group 
     .* matches any character (except newline) [unicode] 
      Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy] 
    (?=[\p{S}]) Positive Lookahead - Assert that the regex below can be matched 
     [\p{S}] match a single character present in the list below 
      \p{S} matches math symbols, currency signs, dingbats, box-drawing characters, etc 
    (?:.*) Non-capturing group 
     .* matches any character (except newline) [unicode] 
      Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy] 
$ assert position at end of the string 
u modifier: unicode: Pattern strings are treated as UTF-16. Also causes escape sequences to match unicode characters 

Demo:

https://regex101.com/r/hE2dD2/1

Смежные вопросы