Panoptik пишет:ну и результат всунуть в регулярку
Ну только смысл тогда вобще регулрку использовать... Если мы так формируем массив, то сразу в теле и ищем эти кусочки в строке пароля. Кстати, вы забыли про этиже строки, но в реверсе.
Вобщем, я так и не придумал как это сделать в регулярке, кроме тупого перечисления вариантов.
Зато вот наваял класс, для проверки пароля, удовлетворяет всем поставленым условиям, плюс я еще от себя добавил проверку на присутствиие хотя бы одной цифры.
Оформил в виде класса, но можно конечно и в функцию все запихать.
PHP:
скопировать код в буфер обмена
final class ValidPass
{
private
$_pass = '',
1 => 'Длина меньше 6 символов',
2 => 'Нет ни одной заглавной буквы',
3 => 'Нет ни одной прописной буквы',
4 => 'Нет ни одной цифры',
5 => 'Нет ни одного специального символа',
6 => 'Недопустимая последовательность символов'
),
$_error = 0,
$_isValid;
public function __construct($pass) {
trigger_error(__CLASS__ . ': Parameter 1 must be string, ' . gettype($pass) . ' given', E_USER_WARNING); } else {
$this->_pass = $pass;
}
}
public function isValid() {
$this->_isValid = $this->_validate();
}
return $this->_isValid;
}
public function getError() {
return $this->_error ? $this->_errors[$this->_error] : '';
}
private function _validate() {
if ($passLen < 6) {
$this->_error = 1;
return false;
}
$bigLetter = $smallLetter = $integer = $symbol = false;
foreach (str_split($this->_pass
) as $letter) { $bigLetter = $bigLetter ?: $code > 64 && $code < 91;
$smallLetter = $smallLetter ?: $code > 96 && $code < 123;
$integer = $integer ?: $code > 47 && $code < 58;
$symbol = $symbol ?: ($code > 32 && $code < 48) || ($code > 57 && $code < 65)
|| ($code > 90 && $code < 97) || ($code > 122 && $code < 127);
}
if (!$bigLetter) {
$this->_error = 2;
return false;
}
if (!$smallLetter) {
$this->_error = 3;
return false;
}
if (!$integer) {
$this->_error = 4;
return false;
}
if (!$symbol) {
$this->_error = 5;
return false;
}
$sequences = array('qwertyuiop', 'asdfghjkl', 'zxcvbnm', '1234567890', 'abcdefghijklmnopqrstuvwxyz'); for ($n = 0, $end = $passLen - 2; $n < $end; $n++) {
foreach ($sequences as $seq) {
$this->_error = 6;
return false;
}
}
}
return true;
}
}
$pass = new ValidPass('P@s$w0rd');
var_dump($pass->isValid(), $pass->getError());
Так я ж не спорю, все работает. Просто руками я напишу туже регулярку на много меньше и красивее. А вот код написать, который бы генерировал такой же результат как я руками пишу, у меня увы не получилось...