Почему это регулярное выражение терпит неудачу? - PullRequest
3 голосов
/ 10 июня 2010

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

array(
    'rule1' => array(
        '/^.*[\d].*$/i',
        'Password must contain at least one number.'
    ),
    'rule2' => array(
        '/^.*[a-z].*$/i',
        'Password must contain at least one lowercase letter'
    ),
    'rule3' => array(
        '/^.*[A-Z].*$/i',
        'Password must contain at least one uppercase letter'
    ),
    'rule4' => array(
        '/^.*[~!@#$%^&*()_+=].*$/i',
        'Password must contain at least one special character [~!@#$%^&*()_+=]'
    )
);

По какой-то причине, независимо от того, что я проверяю, правило «Специальные символы» не выполняется.Я предполагаю, что это проблема с выражением.Если есть лучший (или правильный) способ написания этих выражений, я весь в ушах!

Ответы [ 3 ]

6 голосов
/ 10 июня 2010

Я не вижу проблемы с регулярным выражением ваших специальных символов, но я вижу проблему с проверкой в ​​верхнем и нижнем регистре:

/^.*[A-Z].*$/i

i в конце означает PCRE_CASELESS , т.е. он будет игнорировать регистр. Вы должны опустить i.

1 голос
/ 10 июня 2010

Регулярное выражение должно быть просто:

/[~!@#$%^&*()_+=]/

Звезды не нужны. В любом случае ваше регулярное выражение должно работать.

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

Также, как отметил Марк Байерс, вы должны удалить нечувствительные модификаторы /i

0 голосов
/ 10 июня 2010

Это работает ( как видно на rubular.com ):

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&*()_+=]).*

При этом используется lookahead (который поддерживается функциями PHP preg, поскольку они PCRE) вместо соответствия всем различным правилам. Я не уверен, почему ваш не работает.

Ссылки

...