【问题标题】:Regex not working for password? not sure why正则表达式不适用于密码?不知道为什么
【发布时间】:2011-08-11 23:58:05
【问题描述】:

所以我有一个正则表达式代码来确保密码是 4 到 13 个字符,它总是失败

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

我使用的是正则表达式而不是 php 的长度属性,因为我稍后会添加更多的正则表达式代码。但是,现在我被这个失败的程序卡住了。

问题是,它确保密码超过 3 个字符,但它并不关心它有多长,就好像我没有设置限制一样。

提前致谢

【问题讨论】:

    标签: php regex function passwords preg-match


    【解决方案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 && $length <= 14;
      }
      

      如果你喜欢到处乱搞来拯救你那条线:

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

      但实际上,为什么要将密码长度限制为 14 个字符?这样,您就可以防止人们选择真正安全的密码。你可能应该提高这个限制。

      【讨论】:

      • "很抱歉,length 功能不在在线手册中。"也许你的意思是strlen
      • @Tomalak:没错!很抱歉。
      • 对于 PHP,使用 strlen: php.net/manual/en/function.strlen.php。另外,请确保trim 输入。现在它也将为空格返回 true。
      • @nikic 你说 14 不安全你会推荐多少
      • @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 && $len <= 14) {
          

          相反,因为正则表达式对此完全是多余的。

          【讨论】:

            猜你喜欢
            • 2022-11-12
            • 1970-01-01
            • 2014-01-03
            • 1970-01-01
            • 2017-10-20
            • 2022-08-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多