Validation 代码点火器+;密码中需要字母和数字

Validation 代码点火器+;密码中需要字母和数字,validation,codeigniter,passwords,codeigniter-2,Validation,Codeigniter,Passwords,Codeigniter 2,我想使用表单验证来要求密码同时包含字母和数字字符。以下是我到目前为止的想法: $this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]|min_length[8]|alpha_numeric'); 问题是“字母数字”要求密码只包含字母或数字,而不同时包含字母和数字。在这里选择更强的密码选项。您可以在控制器中设置: public function password_che

我想使用表单验证来要求密码同时包含字母和数字字符。以下是我到目前为止的想法:

$this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]|min_length[8]|alpha_numeric');
问题是“字母数字”要求密码只包含字母或数字,而不同时包含字母和数字。在这里选择更强的密码选项。

您可以在控制器中设置:

public function password_check($str)
{
   if (preg_match('#[0-9]#', $str) && preg_match('#[a-zA-Z]#', $str)) {
     return TRUE;
   }
   return FALSE;
}
然后,更新规则以使用它:

$this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]|min_length[8]|alpha_numeric|callback_password_check');

另一种可以在其他项目中轻松重用并本地化验证规则的解决方案是扩展Form_验证类

在application/libraries/create中创建一个名为MY_Form_validation.php的文件,其中“MY”是在application/config/config.php中设置的子类前缀

这个类看起来像:

class MY_Form_validation extends CI_Form_validation
{
    /**
     * Verify that a string contains a specified number of
     * uppercase, lowercase, and numbers.
     *
     * @access public
     *
     * @param String $str
     * @param String $format
     *
     * @return int
     */
    public function password_check($str, $format)
    {
        $ret = TRUE;

        list($uppercase, $lowercase, $number) = explode(',', $format);

        $str_uc = $this->count_uppercase($str);
        $str_lc = $this->count_lowercase($str);
        $str_num = $this->count_numbers($str);

        if ($str_uc < $uppercase) // lacking uppercase characters
        {
            $ret = FALSE;
            $this->set_message('password_check', 'Password must contain at least ' . $uppercase . ' uppercase characters.');
        }
        elseif ($str_lc < $lowercase) // lacking lowercase characters
        {
            $ret = FALSE;
            $this->set_message('password_check', 'Password must contain at least ' . $lowercase . ' lowercase characters.');
        }
        elseif ($str_num < $number) //  lacking numbers
        {
            $ret = FALSE;
            $this->set_message('password_check', 'Password must contain at least ' . $number . ' numbers characters.');
        }

        return $ret;
    }

    /**
     * count the number of times an expression appears in a string
     *
     * @access private
     *
     * @param String $str
     * @param String $exp
     *
     * @return int
     */
    private function count_occurrences($str, $exp)
    {
        $match = array();
        preg_match_all($exp, $str, $match);

        return count($match[0]);
    }

    /**
     * count the number of lowercase characters in a string
     *
     * @access private
     *
     * @param String $str
     *
     * @return int
     */
    private function count_lowercase($str)
    {
        return $this->count_occurrences($str, '/[a-z]/');
    }

    /**
     * count the number of uppercase characters in a string
     *
     * @access private
     *
     * @param String $str
     *
     * @return int
     */
    private function count_uppercase($str)
    {
        return $this->count_occurrences($str, '/[A-Z]/');
    }

    /**
     * count the number of numbers characters in a string
     *
     * @access private
     *
     * @param String $str
     *
     * @return int
     */
    private function count_numbers($str)
    {
        return $this->count_occurrences($str, '/[0-9]/');
    }
}
这条规则可以以多种不同的方式使用密码检查[1,1,1]”要求密码包含小写、大写和数字字符密码检查[5,0,1]”需要5个大写字符和密码中的数字

这样做的好处是:

  • 所有规则都包含在一个易于移植的类中
  • 子验证函数(如“计数\发生次数”)可轻松用于其他验证函数
  • 可以修改该类以使用应用程序/语言中的语言文件/

  • 使用CI 2.2.0,可以添加一些参数,如“字母数字”参数,请注意管道(级联)参数:

    function check_password(){
     $this -> form_validation -> set_rules('password', 'New Password', 'required|max_length[15]|min_length[6]|alpha_numeric');
     $this -> form_validation -> set_rules('passconf', 'Re-enter', 'required|matches[password]');
    
     if ($this -> form_validation -> run() == FALSE){
      doStuff();
     } else {
      doOtherStuff();
     }
    }
    

    查找页面底部附近的规则引用。

    尝试使用回调:谢谢,我正在使用另一个字段的回调,因此这是一个选项。使用回调和一些正则表达式感谢您给出了这个非常全面的答案;我正在投票表决(因为我已经接受了另一个答案)。我很喜欢这个功能:无论如何,我认为你必须改变列表($username,$lowercase,$number)=分解(“,”,$format);列出($大写,$小写,$数字)=分解(',',$格式);这是一个非常有帮助的完整答案,我将把它添加到我的博客中。您好,先生,我想问一下如何允许使用特殊字符?@Angel您需要添加一个计算特殊字符的函数,以更新
    password\u check
    方法,以便它使用该新函数检查字符串中是否有足够的特殊字符,并修改规则。如果你被一个新问题卡住了。是的,我读过,但我的大脑分析错了-我的错。。。道歉。
    function check_password(){
     $this -> form_validation -> set_rules('password', 'New Password', 'required|max_length[15]|min_length[6]|alpha_numeric');
     $this -> form_validation -> set_rules('passconf', 'Re-enter', 'required|matches[password]');
    
     if ($this -> form_validation -> run() == FALSE){
      doStuff();
     } else {
      doOtherStuff();
     }
    }