PHP Regex для строки с буквенно-цифровыми и специальными символами

Я пытался и не мог найти ответ на этот вопрос, поэтому я задаю этот вопрос.

Мне нужно создать регулярное выражение для проверки пароля, и оно должно иметь следующие условия.

  • По крайней мере, одно письмо
  • По крайней мере, одно число
  • По крайней мере одно специальное письмо ~! ^ () {} <>% @ # & * + = _ –
  • Не должно содержать $ `,. / \; : '' |
  • Должно быть от 8 до 40 символов
  • Без пробелов

Я создал следующее регулярное выражение, но оно работает неправильно.

preg_match('/[A-Za-z\d$!^(){}?\[\]<>~%@#&*+=_-]{8,40}$/', $newpassword) 

Может кто-нибудь, пожалуйста, помогите мне правильно исправить это регулярное выражение?

Благодарю.

Related of "PHP Regex для строки с буквенно-цифровыми и специальными символами"

Здесь вы идете, используя lookaheads, чтобы проверить свои условия:

 ^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!^(){}<>%@#&*+=_-])[^\s$`,.\/\\;:'"|]{8,40}$ 

Давайте сломаем его немного, потому что это выглядит неприятно:

  • ^ Утверждает, что он находится в начале строки.
  • Первый lookahead, (?=.*[a-zA-Z]) , проверяет, содержит ли он хотя бы одну букву (верхнюю или нижнюю).
  • Второй, (?=.*\d) , проверяет, содержит ли он хотя бы одну цифру.
  • Третий, (?=.*[~!^(){}<>%@#&*+=_-]) , проверяет, что он содержит хотя бы один символ из вашего списка специальных символов.
  • Наконец, [^\s$,.\/\\;:'"|]{8,40}$ проверяет, что вся строка длиной от 8 до 40 символов и не содержит пробелов или недопустимых символов с использованием инвертированного символа класс.

Демо на Regex101