Регулярное выражение не работает для пароля? не уверен, почему

#php #regex #function #passwords #preg-match

#php #регулярное выражение #функция #пароли #preg-match

Вопрос:

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

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

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

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

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

Ответ №1:

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

 ^.{3,14}^
  

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

Итак, в основном:

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

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

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

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

Ответ №2:

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

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

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

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

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

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

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

Комментарии:

1. «Извините, но длина функции отсутствует в онлайн-руководстве». Возможно, вы имели в виду strlen ?

2. @Tomalak: Ты прав! Извините за это.

3. Для PHP используйте strlen : php.net/manual/en/function.strlen.php . Кроме того, убедитесь, что trim ввод. Теперь оно также вернет true только для пробелов.

4. @nikic вы говорите, что 14 небезопасен, сколько бы вы порекомендовали

5. @Tom: Хм, трудно сказать. Я лично вообще не ограничиваю максимальный размер. Пароли обычно сохраняются с использованием хэша фиксированного размера, поэтому хранение не является проблемой. Но максимум 100 символов должно быть в порядке. Это должно удовлетворить даже самых параноидальных людей.

Ответ №3:

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

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

Ответ №4:

попробуйте

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

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

Ответ №5:

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

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

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

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

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

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

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