Regex не работает для пароля? не уверен почему - PullRequest
3 голосов
/ 25 апреля 2011

Итак, у меня есть код регулярного выражения, чтобы убедиться, что пароль длиной от 4 до 13 символов, он продолжает отказывать

public function valid_password($password){
        if(preg_match('^.{3,14}^', $password)){
            return true;
        }//end if
        else{
            return false;
        }//end else     
    } 

Я использую регулярное выражение, а не атрибут длины php, потому что позже я добавлю больше кода регулярного выражения. Тем не менее, теперь я застрял с этой ошибкой программы.

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

Заранее спасибо

Ответы [ 5 ]

2 голосов
/ 25 апреля 2011

Вы использовали ^ в качестве разделителей php.net / mregexp.reference.delimiters.php здесь:

^.{3,14}^

Это возможно, но не очень хорошая идея в вашем случаепотому что вам нужно ^ для его фактического назначения.Обычно соответствует началу предмета.И чтобы правильно посчитать длину, вам нужно это сделать.Вам также понадобится метасимвол $ конца субъекта.

В общем:

preg_match('/^.{3,14}$/'

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

preg_match('/(?=^.{3,14}$) (...)/x', $password)

Это позволит вам указать что-то еще вместо ... - и оставить проверку длины неявной.

2 голосов
/ 25 апреля 2011

^ - это якорь для начала строки. Конец строки разделяется с помощью $:

public function valid_password($password) {
    return preg_match('~^.{3,14}$~', $password);
}

Но в этом случае я бы не использовал регулярное выражение, а вместо этого функцию strlen:

public function valid_password($password) {
    $length = strlen($password);
    return $length >= 3 && $length <= 14;
}

Если вам нравится взламывать, чтобы сохранить эту строку:

public function valid_password($password) {
    return isset($password[2]) && !isset($password[14]);
}

Но на самом деле, почему вы хотите ограничить длину пароля до 14 символов? Таким образом, вы не позволяете людям выбирать действительно надежные пароли. Вы, вероятно, должны поднять этот предел.

1 голос
/ 25 апреля 2011

Попробуйте это:

preg_match('/^.{3,14}$/', $password)
1 голос
/ 25 апреля 2011

^ соответствует началу строки, а не концу.$ соответствует концу.

И вы забыли свои разделители.

Полная фиксированная строка:

if (preg_match('/^.{3,14}$/', $password)) {

Однако я сильно рекомендуем вместо этого использовать:

$len = strlen($password);
if ($len >= 3 && $len <= 14) {

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

1 голос
/ 25 апреля 2011

попробовать

preg_match('/^.{3,14}$/', $password)

но регулярное выражение для подсчета длины строки ??= Избыток

...