7

フォーム検証を使用して、英字と数字の両方を含むパスワードを要求したいと考えています。これが私がこれまでに思いついたものです:

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

問題は、「alpha_numeric」ではパスワードに文字または数字のみが含まれている必要があり、両方は必要ないことです。ここでは、より強力なパスワード オプションを選択します。

4

3 に答える 3

18

コントローラでコールバックを設定できます。

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');
于 2012-05-10T00:26:52.567 に答える
15

他のプロジェクトで簡単に再利用でき、検証ルールをローカライズできる代替ソリューションは、Form_validation クラスを拡張することです。

application/libraries/ で、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]/');
    }
}

次に、ルールを設定します。

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

このルールは、さまざまな方法で使用できます。「password_check[1,1,1]」では、パスワードに小文字、大文字、および数字が含まれている必要があります。「password_check[5,0,1]」では、パスワードに 5 つの大文字と数字が必要です。

このようにする利点は次のとおりです。

  1. すべてのルールは、簡単に移植できるクラスに含まれています
  2. 「count_occurences」などのサブ検証関数は、他の検証関数で簡単に使用できます。
  3. application/language/ の言語ファイルを使用するようにクラスを変更できます。
于 2012-05-16T07:46:44.150 に答える
-2

CI 2.2.0 を使用すると、「alpha_numeric」パラメーターなど、追加できるパラメーターがあります。パイプ (カスケード) パラメーターに注意してください。

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();
 }
}

このページの下部にあるルール リファレンスを探してください。

于 2014-07-25T20:56:03.167 に答える