PHP, регулярные выражения, не допускайте пробелы в пароле

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

Минимум 1 строчная буква [a-z].Минимум 1 заглавная буква [A-Z].Минимум 1 числовой символ [0-9].Пароль не должен содержать никаких специальных символов, символов или пробелов.Пароли должны быть длиной не менее 8 символов. Максимально допустимая длина составляет 30 символов.

Прямо сейчас я сгенерировал строку RegEx, которая включает все, но не часть с пробелами. Если кто-нибудь знает, что не так с этой строкой, пожалуйста, исправьте меня и скажите, как решить проблему. Кстати, я пытался [\ S], но не работает, я не знаю почему.

Моя линия RegExp:

^(?=(?:.*[A-Z]){1,})(?=(?:.*[a-z]){1,})(?=(?:.*\d){1,})(?!(?:.*[[email protected]#$%^&*()\-_=+{};:,<.>]))(.{8,30})$

Вот полная демонстрация действительных и недействительных паролей с этим RegEx:демонстрация

Спасибо всем, что ответит и поможет мне.

 Martin C.09 июн. 2016 г., 22:53
@ chris85 Да, ты прав, я сделаю это.
 chris8509 июн. 2016 г., 22:48
Password should not contain any special characters, symbols почему бы и нет?
 Martin C.09 июн. 2016 г., 22:53
@ Marxtai Я полностью с тобой согласен. Может быть, я передумаю клиента
 Martin C.09 июн. 2016 г., 23:13
@ WiktorStribiżew Я попробовал это до окончания строки, как это [/ S] $. Это мой первый раз, когда я делаю регулярные выражения, поэтому я не знал, где их разместить.
 Jay Blanchard09 июн. 2016 г., 22:47
Разрешить пользователям использоватьпароли / фразы они хотят.Не ограничивайте пароли.
 Wiktor Stribiżew09 июн. 2016 г., 22:48
Пытаться^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?!.*[[email protected]#$%^&*()\-_=+{};:,<.>])\S{8,30}$, Кстати, как сделалвы пытаться[\S]?
 Martin C.09 июн. 2016 г., 22:49
@ chris85, потому что это было необходимо. Я делаю то, что они просили.
 Sebastian Proske09 июн. 2016 г., 22:49
Почему бы просто не использовать[a-zA-Z0-9]{8,30} вместо.{8,30} и вообще избежать последнего взгляда?
 chris8509 июн. 2016 г., 22:51
@MartinC. Вы должны сказать, кто бы ни сделал спецификацию, она ошибочна.
 Drown09 июн. 2016 г., 22:49
Запрещение пробелов, специальные символы и максимальная длина - все это хорошие способы сделать ваш пароль пользователя слабее и легче взломать. Пусть они используют пароль, который они хотят, как долго они хотят.
 Martin C.09 июн. 2016 г., 22:53
@ WiktorStribiżew Спасибо! Это сработало отлично!

Ответы на вопрос(2)

Решение Вопроса

как вы пытались использовать\S, но это именно то, что вы можете использовать и использовать вместо. в основной структуре потребления:

\A                 # Start of string
  (?=[^A-Z]*[A-Z]) # Require at least one uppercase letter 
  (?=[^a-z]*[a-z]) # Require at least one lowercase letter
  (?=\D*\d)        # Require at least one digit
  (?![^[email protected]#$%^&*()\-_=+{};:,<.>]*[[email protected]#$%^&*()\-_=+{};:,<.>]) # No special chars
 \S{8,30}          # Match 8 to 30 non-whitespace chars
\z                 # Unambiguous end of string.

Увидетьregex demo (демонстрационное регулярное выражение немного отличается, так как тест выполняется для многострочной строки, вот тот, который вы должны использовать.)

Здесь я использовал принцип контраста внутри предвкушений и удалил ненужные группы без захвата.

Также безопаснее использовать\z привязка, чтобы соответствовать концу строки, так как$ может соответствовать перед последней строкой в ​​строке.

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

^                 # the beginning
(?=[^a-z]*[a-z])  # at least one lower case
(?=[^A-Z]*[A-Z])  # at least one upper case
(?=\D*\d)         # at least one digit
[\da-zA-Z]{8,30}  # digits and characters from a-z
$                 # the end

Увидетьдемо на regex101.com.

ВPHP это было бы:

<?php
$regex = '~
            ^                 # the beginning
            (?=[^a-z]*[a-z])  # at least one lower case
            (?=[^A-Z]*[A-Z])  # at least one upper case
            (?=\D*\d)         # at least one digit
            [\da-zA-Z]{8,30}  # digits and characters from a-z
            $                 # the end
         ~x';

$password = "Someveryweakpassword123";
if (preg_match($regex, $password)) {
    echo "Yes, it does";
}
?>

Увидетьдемо на ideone.com.
Опять же, эти пароли очень легко угадать, и чтобы сделать их еще проще, вы также можете хранить их в виде простого текста (но, пожалуйста, оставьте здесь ссылку, чтобы другие не регистрировались на этом сайте :).

 Jan09 июн. 2016 г., 23:07
@ WiktorStribiżew: Правильно, я бы даже пошел дальше и предложил бы изменить спецификацию все вместе :)
 Martin C.09 июн. 2016 г., 23:05
Большое спасибо за ответ! И вы правы, как и другие ответы. Я знаю, что это заставит пароль выглядеть очень неделей, поэтому я попытаюсь изменить это, и я удалю выражение со специальными символами.
 Wiktor Stribiżew09 июн. 2016 г., 23:04
Смысл использования негативного взгляда, запрещающего специальные символы, заключается в том, что основной шаблон потребления по-прежнему может разрешать буквы Юникода и другие символы. Вот почему я предлагаю оставить все как есть.

Ваш ответ на вопрос