Пароль Regex Gov Reqs

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

  1. Хотя бы один верхний регистр
  2. Хотя бы одна строчная
  3. Хотя бы один номер
  4. Хотя бы один специальный символ

Имейте следующий код:

if (empty(trim($_POST["password"]))) {
    $passwordErr = "Please enter a password.";
    } elseif (trim($_POST["password"]) === $username) {
        $passwordErr = "Cannot be the same as your username";
    } elseif (trim_check($_POST["password"]) == TRUE) {
        $passwordErr = "Please do not use a space in your password.";
    } elseif (!preg_match('/^(?=.*\d)(?=.*[\x21-\x7E])(?=.*[a-z])(?=.*[A-Z])[0-9A-Za-z\x21-\x7E]{6,50}$/',($_POST['password']))) {
        $passwordErr = "Must be six to fifty characters in length and at least one of each: <ul><li><strong>Uppercase</strong></li><li><strong>Lowercase</strong></li><li><strong>Number</strong></li><li><strong>Special Character</strong></li></ul>";
    } else {
        $password = trim($_POST['password']);
    }

Функция, которой она передается, только обрезает пробелы, прежде чем убедиться, что пробелов нет:

function trim_check($data) {
    $data = trim($data);
    $data = preg_match('/\s/',($data));
    return $data;
}

Есть две вещи, о которых я хочу спросить:

  1. \x21-\x7Eправильно ли определен с использованием регулярного выражения php для ascii в обеих частях выражения (см. № 2, что я имею в виду под обеими частями).
  2. Что делает эта часть выражения [0-9A-Za-z\x21-\x7E], чего еще не делает эта часть (?=.*\d)(?=.*[\x21-\x7E])(?=.*[a-z])(?=.*[A-Z])?

Кажется, он работает нормально, но я не знаю, упускаю ли я что-то. Лучшее, что я могу сказать, это то, что он должен содержать как минимум: 1 верхний регистр - 1 нижний регистр - 1 номер - 1 специальный символ (любой, кроме пробела) и - Это должна быть буква, цифра и специальный символ (но я чувствую, что это избыточно)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот ваше текущее регулярное выражение, разбитое на несколько строк для удобства чтения:

^
    (?=.*\d)                     \
    (?=.*[\x21-\x7E])             \
    (?=.*[a-z])                   /  assert some conditions
    (?=.*[A-Z])                  /
    [0-9A-Za-z\x21-\x7E]{6,50}   --  match here
$

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

[0-9A-Za-z\x21-\x7E]{6,50}

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

Попался, утверждать и сопоставлять. Спасибо. Похоже, синтаксис правильный, и я полагаю, что включил все необходимые символы ascii. Цените свое время!

Ryan Steiger 16.04.2019 03:23

Другие вопросы по теме