2, 'max' => 16]; private $passwordLength = 3; private $minimumAge = 16; public function setDisallowedLogins(array $disallowedLogins) { $this->disallowedLogins = $disallowedLogins; } public function setPasswordLength($max) { $max = (int)$max; if ($max > 0) { $this->passwordLength = $max; } } public function setLoginLength($max, $min = 2) { $max = (int)$max; $min = (int)$min; if ($max > 0 && $min > 0 && $max > $min) { $this->loginLength = ['min' => $min, 'max' => $max]; } } public function setMinimumAge($years) { $years = (int)$years; if ($years > 0) { $this->minimumAge = $years; } } /** * Работа с логином. * * 1. Убираем множественные пробелы между словами * 2. Убираем проблемы перед и после. * 3. Проверяем можно ли использовать логин сравнивая со списком разрешенных. * 4. Проверяем нет ли в логине одинаково выглядящих букв из разных раскладок. * 5. Проверяем минимальный и максимальный размер. * 6. Проверяем запрещённые символы. * * @param $login * @return $this */ public function setLogin($login) { $login = preg_replace('!\s+!', ' ', $login); // remove inner spaces $login = trim($login); // remove outer spaces if ( $this->loginIsAllowed($login) && !$this->loginIsMixed($login) && mb_strlen($login <= $this->loginLength['min']) && mb_strlen($login) >= $this->loginLength['max'] && !strpos("!@#$%^&*()\+|/'\"", $login) ) { $this->login = $login; } return $this; } private function loginIsAllowed($login) { $d = implode('|', $this->disallowedLogins); $pattern = "/\b($d)\b/iu"; return !preg_match($pattern, $login); } private function loginIsMixed($login) { $en = preg_match("/^(([0-9A-z -])+)$/iu", $login); $ru = preg_match("/^([а-яёіїє\s\d]*)$/iu", $login); return ($ru && $en) || (!$ru && !$en); } /** * Проверяем почту встроенным валидатором. Его хватает для большинства задач. * * @param $email * @return $this */ public function setEmail($email) { if (filter_var($email, FILTER_VALIDATE_EMAIL)) { $this->email = $email; } return $this; } /** * Проверяем пароли. * * 1. Два пароля должны совпадать. * 2. Пароль должен быть заданной длинны. * 3. Если с паролем всё ок, оборачиваем его в md5() * * !!! Это очень ненадёжно. Уже давно стоит перейти на password_hash() / password_verify() * * @param $password * @param $passwordVerify * @return $this */ public function setPassword($password, $passwordVerify) { if ($this->password === $passwordVerify && mb_strlen($password) >= $this->passwordLength) { $this->password = md5($password); } return $this; } /** * Проверяем дату рождения. * * 1. Входящая строка должна быть реально существующей датой. * 2. Эта дата должна быть больше чем минимальный возраст игрока. * * @param $birthday * @return $this */ public function setBirthday($birthday) { $bdate = DateTime::createFromFormat('Y-m-d', $birthday); $today = new DateTime(); $interval = $today->diff($bdate); if ($bdate && $interval->y >= $this->minimumAge) { $this->birthday = $bdate->format('d.m.Y'); } return $this; } public function setSex($sex) { if ((int)$sex > 0) { $this->sex = $sex; } return $this; } public function get() { return [ 'login' => $this->login, 'email' => $this->email, 'password' => $this->password, 'birthday' => $this->birthday, 'sex' => $this->sex, ]; } } ## написано под PHP 5.6 ## использование: require_once 'path/to/RegisterValidator.php'; $rv = new RegisterValidator(); # обязательно $rv->setDisallowedLogins([ 'Мироздатель', 'Мусорщик', 'Комментатор', ]); # Длинна логина. Необязательный параметр, по умолчанию 16. Можно указать второе число - минимальную длинну. $rv->setLoginLength(16); $rv->setLoginLength(16, 3); # Длинна пароля. Необязательный параметр, по умолчанию 3. $rv->setPasswordLength(3); # Минимальный возраст игрока. Необязательный параметр, по умолчанию 16. $rv->setMinimumAge(16); # Проверяем введённые значения и записываем результат в массив если всё ок, или пустую строку, если не ок. # [login->string, email->string, password->md5(string), birthday->dd.mm.YYYY, sex->int] # birthday заточен под , если надо в том формате, что сейчас, надо записывать в него: # $birthday = "$yy-$mm-$dd"; $values = $rv ->setLogin($login) ->setPassword($pass1, $pass2) ->setEmail($email) ->setBirthday($birthday) ->setSex($sex) ->get();