Для государственного генерального подрядчика, который хочет применить регулярное выражение пароля в соответствии со своими требованиями:
Имейте следующий код:
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;
}
Есть две вещи, о которых я хочу спросить:
\x21-\x7Eправильно ли определен с использованием регулярного выражения php для ascii в обеих частях выражения (см. № 2, что я имею в виду под обеими частями).[0-9A-Za-z\x21-\x7E], чего еще не делает эта часть (?=.*\d)(?=.*[\x21-\x7E])(?=.*[a-z])(?=.*[A-Z])?Кажется, он работает нормально, но я не знаю, упускаю ли я что-то. Лучшее, что я могу сказать, это то, что он должен содержать как минимум: 1 верхний регистр - 1 нижний регистр - 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. Цените свое время!