Регулярное выражение для пароля, содержащего не менее 8 символов и не менее 1 не алфавитно-цифровых символов

Я пытаюсь сделать проверку в PHP, если пользователь меняет свой пароль, его новый пароль должен быть 8 или более символов и по крайней мере с 1 не алфавитно-цифровым паролем. Как я должен проверить это и каким будет регулярное выражение?

Проверка длины - это простая часть strlen >= 8, Моя проблема - регулярные выражения. Я действительно понятия не имею о регулярных выражениях, даже после нескольких лет изучения информатики.

Спасибо

6 ответов

Решение

Попробуйте что-то вроде этого, чтобы проверить, использовали ли они не алфавитно-цифровые символы:

if( !preg_match( '/[^A-Za-z0-9]+/', $password) || strlen( $password) < 8)
{
    echo "Invalid password!";
}

if заявление оценит true если $password не содержит хотя бы одного из символов, отсутствующих в списке (буквенно-цифровые символы).

Попробуй это.

~^(.*[\W]+.*){8,}$~
  • . * ищет любой символ 0 или более раз
  • [\W]+ соответствует хотя бы одному несловесному символу
  • {8,} соответствует значению в скобках, только если длина составляет 8 или более символов
  • ^ $ соответствует началу и концу строки

Насколько мне известно, вы не можете достичь этого, потому что это сложный сценарий состояния.

Что вам нужно сделать, это сделать в три этапа:

$has8characters = (mb_strlen($_REQUEST['password']) >= 8);
$hasAlphaNum = preg_match('b[a-z0-9]+bi', $_REQUEST['password']);
$hasNonAlphaNum = preg_match('b[\!\@#$%\?&\*\(\)_\-\+=]+bi', $_REQUEST['password']);

Это не было проверено, но вы достаточно близки к тому, что вы хотите достичь с этим...

Удачи

Если вы проверяете длину строки с помощью strlen/mb_strlen, вы можете просто написать регулярное выражение, соответствующее любому не алфавитно-цифровому символу. Если это соответствует одному (или более), вы хорошо. Например:

$password = 'asdf123!';

if(mb_strlen($password) >= 8 and preg_match('/[^0-9A-Za-z]/', $password))
{
    // password is valid
}

Это должно работать (не проверено)

if (preg_match('/^(?=.*[\W])(?=[a-z0-9])[\w\W]{8,}$/i', '123abc!$'))
{
    //error
}

Убедитесь, что пароль имеет длину 8 символов и имеет хотя бы один специальный символ

Это решает это. Попробуй!

if(!preg_match('/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,}$/', $pass)) {
  echo "Password does not meet the requirements! It must be alphanumeric and atleast 8 characters long";
}
Другие вопросы по тегам