2015-07-31 3 views
1

Я пытаюсь получить другую ошибку для каждого типа: отсутствие прописных букв, отсутствие нижнего регистра, отсутствующий номер или пробел. Длина, кажется, единственная работа. Я угадываю, потому что это в начале кода. Я пробовал разные варианты и не могу заставить его работать.Проверка пароля с помощью Regex

<?php 
    $Passwords = array(
"F!ve5", 
"This !s12", 
"w!zard12", 
"W!ZARD12", 
"W!zardJK", 
"Wizard12", 
"!Qazxsw2", 
"@Wsxzaq1", 
"@Wsxcde3", 
"#Edcxsw2"); 

foreach ($Passwords as $StongPass) { 
echo "<p>The Password &ldquo;" . $StongPass . 
    "&rdquo; </p>"; 
if (strlen($StongPass)<8) 
    echo "Password is to short!"; 

elseif (strlen($StongPass)>16) 
    echo "Password is to long!"; 

elseif (preg_match('/P[A-Z]/', $StongPass)) 
    echo "Password does not contain an upper case letter!"; 

elseif (preg_match('/P[a-z]/', $StongPass)) 
    echo "Password does not contain a lower case letter!"; 

elseif (preg_match('/P[[email protected]#$%^&*()\-_=+{};:,<.>]/', $StongPass)) 
    echo "Password does not contain a special letter!"; 

elseif (preg_match('/P[0-9]/', $StongPass)) 
    echo "Password does not contain a number!"; 

elseif (preg_match('/P[""]/', $StongPass)) 
    echo "Password cannot contain any spaces!"; 

else 
    echo "Password is strong!"; 

    } 
    ?> 

Результаты выглядят как этот «Пароль„F! VE5“ Пароль должен коротка! пароль„это! S12“ Пароль сильна! Пароля„W! Zard12“ Пароль сильный! Пароль «W! ZARD12» Пароль прочен! »

+0

Почему 'P' в начале каждого регулярного выражения? Эти шаблоны будут соответствовать только в том случае, если строка содержит 'P' непосредственно перед символом, который вы ищете. –

+0

Я избавился от P и добавил! Preg_match это помогло, за исключением последних четырех, которые должны быть vaild теперь говорят, что он не соответствует из-за пробела. – WiseFool

+0

Нет причин ограничивать длину пароля или не допускать пробелы. Вы все равно не должны хранить пароли. –

ответ

1

Капитал P не имеет особого значения в регулярном выражении. Это было беспорядок. Обратите внимание на использование preg_match() в некоторых случаях. Я полностью переписал чек для символов, потому что многие из них имеют особое значение, и немного легче использовать диаграмму ASCII для их группировки.

if (strlen($StongPass)<8) 
    echo "Password is to short!"; 

elseif (strlen($StongPass)>16) 
    echo "Password is to long!"; 

elseif (!preg_match('/[A-Z]/', $StongPass)) 
    echo "Password does not contain an upper case letter!"; 

elseif (!preg_match('/[a-z]/', $StongPass)) 
    echo "Password does not contain a lower case letter!"; 

elseif (!preg_match('/[!-\/:[email protected][-`{-~]/', $StongPass)) 
    echo "Password does not contain a special letter!"; 

elseif (!preg_match('/\d/', $StongPass)) 
    echo "Password does not contain a number!"; 

elseif (preg_match('/\s/', $StongPass)) 
    echo "Password cannot contain any spaces!"; 

else 
    echo "Password is strong!"; 
+0

Специальный персонаж бросает все, когда я использую его таким образом. Я действительно изменился на! Preg_match, который помог. Мой вопрос после этого сохранял только perg_match для пространства. – WiseFool

+0

'' '/ [! - \ /: - @ [-' {- ~/''' Это не имеет никакого смысла. Вы забыли закрыть класс персонажа? Другое дело, что использование диапазона для специального символа очень сбивает с толку читателя. Просто перечислите символы. – nhahtdh

+0

@nhahtdh вы правы. Я закрыл класс в ответе. Я не перечислил их всех, потому что я не мог точно помнить, какие символы нужно избегать. –

3

Там много PHP кода здесь излишним, так как вся проверка может быть сделано в одно регулярное выражение, используя ряд прогнозных групп.

Используя эту модель

/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\s])/ 

каждой группы (в скобках) соответствует элементу требуемой проверки где-то в следующей строке, а затем сбрасывает указатель для следующей группы. Таким образом, строка должна соответствовать каждой группе в шаблоне для передачи.

Сломался его компонентов мы получаем

^   Make sure we start at the beginning of the string. 
(?=.*[A-Z]) Match A-Z in the string 
(?=.*[a-z]) Match a-z (separate, since we want at least one of each) 
(?=.*[0-9]) Match 0-9 
(?=.*[,;:]) Match comma, semicolon or colon. Add additional special characters as required 
(?=.{8,16}) Match length between 8 and 16 characters 
(?!.*[\s]) Match if whitespace *does not* appear. 

В PHP это станет

$pattern = '/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\s])/' 
$str = "Ab0:padding"; 
if (preg_match($pattern, $str)) { //true 
    // do stuff 
} else { 
    // Do other stuff 
} 

В качестве альтернативы:

$pattern = '/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[,;:])(?=.{8,16})(?!.*[\s])/' 
$str = "Ab0: padding"; 
if (preg_match($pattern, $str)) { // false 
    // do stuff 
} else { 
    // Do other stuff 
} 

Там пример играть с here

Благодаря Alan Moore для this answer, который составляет основу вышеизложенного.

+0

Я собираюсь поиграть с этим. Я только что сделал редактирование с тем, что у меня получилось.Я знаю, что это избыточно. Я просто не знал, как заставить его сказать, что не так с каждым элементом массива. Вот почему он был разбит на множество других утверждений elseif. – WiseFool

+0

Закрепите свое регулярное выражение. Вход проходит проверку, даже если перед строкой 'Ab0: padding' есть новая строка. Кажется, что в PCRE есть ошибка, которая дает ожидаемый результат для пробела, а затем 'Ab0: padding', но не рассчитывайте на это. http://ideone.com/a4RJsF – nhahtdh

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