LoginSignup
10
21

More than 5 years have passed since last update.

CodeIgniter日本語用form_validation拡張クラス

Posted at

以前、AIDREAMさんが日本語用のform_validation拡張クラスを公開していました。

これが結構参考になったのですが、ページが見れなくなってしまいました。
折角ですので、参考までに、手元にあったコードを公開しておきます。
オリジナルの作成者はあくまでAIDREAMさんです。

拡張クラスを少しカスタマイズした覚えがあります。

  • clear_field_dataメソッドを追加
  • valid_emailのpreg_matchの正規表現を変更

メールアドレスの正規表現は元々緩めの表現だったと記憶しています。
少し厳しめにしたはずですが、それでもdocomoのRFC非準拠アドレスは許可しています。

MY_form_validation.php
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 5.1.6 or newer
 *
 * @package        CodeIgniter
 * @author        ExpressionEngine Dev Team
 * @copyright    Copyright (c) 2008 - 2011, EllisLab, Inc.
 * @license        http://codeigniter.com/user_guide/license.html
 * @link        http://codeigniter.com
 * @since        Version 1.0
 * @filesource
 */

// ------------------------------------------------------------------------

/**
 * Form Validation Class for Japanese
 *
 * @package
 * @subpackage Libraries
 * @category Validation
 * @author Copyright (c) 2011, AIDREAM.
 * @link
 */
class MY_Form_validation extends CI_Form_validation {

    /**
     * Constructor
     */
    public function __construct($rules = array())
    {
        parent::__construct($rules);
    }

    /**
     * Validationデータを初期化する(set_value関数などの履歴データ初期化)
     * @return Form_validation
     */
    public function clear_field_data() {

        $this->_field_data = array();
        return $this;
    }
    // --------------------------------------------------------------------

    /**
     * 入力値の整形(変換)
     *
     * @access public
     * @param    string
     * @param string
     * @return string
     *
     *
     */
    function convert($str, $val)
    {
        if($str == '') {
            return '';
        }

        switch($val)
        {
            case 'single': // 半角文字列
                return mb_convert_kana($str, 'ras');
                break;
            case 'double': // 全角文字列
                return $val = mb_convert_kana($str, 'ASKV');
                break;
            case 'hiragana': // ひらがな
                return mb_convert_kana($str, 'HVc');
                break;
            case 'katakana': // 全角カタカナ
                return mb_convert_kana($str, 'KVC');
                break;
            case 'single_katakana': // 半角カタカナ
                return mb_convert_kana($str, 'kh');
                break;
            case 'phone': // 電話番号
                $str = mb_convert_kana($str, 'ras');
                return str_replace(array('ー','―','‐'), '-', $str);
                break;
            case 'postal': // 郵便番号
                $str = mb_convert_kana($str, 'ras');
                $str = str_replace(array('ー','―','‐'), '-', $str);
                if(strlen($str) == 7 AND preg_match("/^[0-9]+$/", $str))
                {
                    $str = substr($str, 0, 3) . '-' . substr($str, 3);
                }
                return $str;
                break;
            case 'ymd': // 西暦年月日
                $str = mb_convert_kana($str, 'ras');
                $str = str_replace('/', '-', $str);
                if (preg_match('/^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$/', $str) AND strlen($str) != 10) {
                    $tmp = explode('-', $str);
                    return vsprintf("%4d-%02d-%02d", $tmp); // 月日の箇所をゼロ詰めに整形
                }
                break;
            case 'html': // HTMLタグからXSSなどの悪意のあるコードを除外
                $CI =& get_instance();
                $CI->load->helper('escape_helper'); // escape_helper.php については http://blog.aidream.jp/?p=1479 を参照ください
                $clean_html = purify($str);
                return ($clean_html == '<p></p>'.PHP_EOL) ? '' : $clean_html; // TinyMCEヘルパを使用している場合の対策
                break;
        }
    }

    // --------------------------------------------------------------------

    /**
     * 半角チェック
     *
     * @access public
     * @param    string
     * @return bool
     *
     */
    function single($str)
    {
        if ($str == '')
        {
            return TRUE;
        }
        return (strlen($str) != mb_strlen($str)) ? FALSE: TRUE;
    }

    // --------------------------------------------------------------------

    /**
     * 全角チェック
     *
     * @access public
     * @param    string
     * @return bool
     *
     */
    function double($str)
    {
        if ($str == '')
        {
            return TRUE;
        }
        $ratio = (mb_detect_encoding($str) == 'UTF-8') ? 3 : 2;
        return (strlen($str) != mb_strlen($str) * $ratio) ? FALSE : TRUE;
    }
    /*
    // 上記以外の判別方法
    function double($str)
    {
        if ($str == '')
        {
            return TRUE;
        }
        $str = mb_convert_encoding($str, 'UTF-8');
        // 半角文字が含まれていない場合 TRUE
        return (preg_match("/(?:\xEF\xBD[\xA1-\xBF]|\xEF\xBE[\x80-\x9F])|[\x20-\x7E]/", $str)) ? FALSE : TRUE;
    }
    */

    // --------------------------------------------------------------------

    /**
     * ひらがな チェック
     *
     * @access public
     * @param    string
     * @return bool
     *
     */
    function hiragana($str)
    {
        if ($str == '')
        {
            return TRUE;
        }
        $str = mb_convert_encoding($str, 'UTF-8');
        return ( ! preg_match("/^(?:\xE3\x81[\x81-\xBF]|\xE3\x82[\x80-\x93]|ー)+$/", $str)) ? FALSE : TRUE;
    }

    // --------------------------------------------------------------------

    /**
     * 全角カタカナ チェック
     *
     * @access public
     * @param    string
     * @return bool
     *
     */
    function katakana($str)
    {
        if ($str == '')
        {
            return TRUE;
        }
        $str = mb_convert_encoding($str, 'UTF-8');
        return ( ! preg_match("/^(?:\xE3\x82[\xA1-\xBF]|\xE3\x83[\x80-\xB6]|ー)+$/", $str)) ? FALSE : TRUE;
    }

    // --------------------------------------------------------------------

    /**
     * 半角カタカナ チェック
     *
     * @access public
     * @param    string
     * @return bool
     *
     */
    function single_katakana($str)
    {
        if ($str == '')
        {
            return TRUE;
        }
        $str = mb_convert_encoding($str, 'UTF-8');
        return ( ! preg_match("/^(?:\xEF\xBD[\xA1-\xBF]|\xEF\xBE[\x80-\x9F])+$/", $str)) ? FALSE : TRUE;
    }

    // --------------------------------------------------------------------

    /**
     * メールアドレス チェックの拡張
     *
     * @access public
     * @param    string
     * @return bool
     *
     */
    function valid_email($str)
    {
        if ($str == '')
        {
            return TRUE;
        }

        //docomoのRFC非準拠アドレスを許可するパターンを使用しています。
        $addr_spec="/^[-+.¥¥w]+@[-a-z0-9]+(¥¥.[-a-z0-9]+)*¥¥.[a-z]{2,6}$/i";
        return  ( ! preg_match($addr_spec, $str)) ? FALSE : TRUE;
    }

    // --------------------------------------------------------------------

    /**
     * 入力値一致チェックの拡張(POST値の配列は5階層まで対応可)
     *
     * @access    public
     * @param    string
     * @param    field
     * @return    bool
     *
     */
    function matches($str, $field)
    {
        if ($str == '')
        {
            return TRUE;
        }
        if (strpos($field, '[') !== FALSE AND preg_match_all('/\[(.*?)\]/', $field, $matches))
        {
            $x = explode('[', $field);
            $indexes[] = current($x);
            for ($i = 0; $i < count($matches['0']); $i++)
            {
                if ($matches['1'][$i] != '')
                {
                    $indexes[] = $matches['1'][$i];
                }
            }
            switch(count($indexes))
            {
                case 2:
                    return isset($_POST[$indexes[0]][$indexes[1]]) AND $str == $_POST[$indexes[0]][$indexes[1]];
                    break;
                case 3:
                    return isset($_POST[$indexes[0]][$indexes[1]][$indexes[2]]) AND ($str == $_POST[$indexes[0]][$indexes[1]][$indexes[2]]);
                    break;
                case 4:
                    return isset($_POST[$indexes[0]][$indexes[1]][$indexes[2]][$indexes[3]]) AND ($str == $_POST[$indexes[0]][$indexes[1]][$indexes[2]][$indexes[3]]);
                    break;
                case 5:
                    return isset($_POST[$indexes[0]][$indexes[1]][$indexes[2]][$indexes[3]][$indexes[4]]) AND ($str == $_POST[$indexes[0]][$indexes[1]][$indexes[2]][$indexes[3]][$indexes[4]]);
                    break;
            }
        }
        else
        {
            if ( ! isset($_POST[$field]))
            {
                return FALSE;
            }
            return ($str != $_POST[$field]) ? FALSE : TRUE;
        }
    }

    // --------------------------------------------------------------------

    /**
     * 電話番号チェック
     *
     * @access public
     * @param    string
     * @return bool
     *
     */
    function phone($str)
    {
        if ($str == '')
        {
            return TRUE;
        }
        return ( ! preg_match("/^\d{2,5}\-\d{1,4}\-\d{1,4}$/", $str)) ? FALSE : TRUE;
    }

    // --------------------------------------------------------------------

    /**
     * 郵便番号チェック
     *
     * @access public
     * @param    string
     * @return bool
     *
     */
    function postal($str)
    {
        if ($str == '')
        {
            return TRUE;
        }
        return ( ! preg_match("/^\d{3}\-\d{4}$/", $str)) ? FALSE : TRUE;
    }

    // --------------------------------------------------------------------

    /**
     * クレジットカード 名義チェック(英字大文字)
     *
     * @access public
     * @param    string
     * @return bool
     *
     */
    function creditcard_name($str)
    {
        if ($str == '')
        {
            return TRUE;
        }
        return ( ! preg_match("/^[A-Z]+[\s| ]+[A-Z]+[\s| ]*[A-Z]+$/", $str)) ? FALSE : TRUE;
    }

    // --------------------------------------------------------------------

    /**
     * YYYY-MM-DD形式のチェック
     *
     * @access public
     * @param    string
     * @return bool
     *
     */
    function ymd($str)
    {
        if ($str == '')
        {
            return TRUE;
        }
        $tmp = explode('-', $str);
        if (count($tmp) != 3) {
            return false;
        }
        $tmp = array_map('intval', $tmp);
        return ( ! checkdate($tmp[1], $tmp[2], $tmp[0])) ? FALSE : TRUE;
    }

    // --------------------------------------------------------------------

    /**
     * 環境依存文字・旧漢字などJISに変換できない文字チェック
     *
     * @access public
     * @param    string
     * @return bool
     *
     */
    function jis($str)
    {
        if ($str == '')
        {
            return TRUE;
        }
        $str = str_replace(array('~', 'ー', '-', '∥', '¢', '£', '¬'), '', $str);
        $str2 = mb_convert_encoding($str, 'iso-2022-jp', $encoding);
        $str2 = mb_convert_encoding($str2, $encoding,'iso-2022-jp');
        return ($str != $str2) ? FALSE : TRUE;
    }

    // --------------------------------------------------------------------

    /**
     * 対になっているフィールドの値が存在するかチェック
     *
     * @access public
     * @param    string
     * @param string
     * @return bool
     *
     */
    function pair($str, $field)
    {
        if ($str == '')
        {
            return TRUE;
        }
        if (strpos($field, '[') !== FALSE AND preg_match_all('/\[(.*?)\]/', $field, $matches))
        {
            $x = explode('[', $field);
            $indexes[] = current($x);
            for ($i = 0; $i < count($matches['0']); $i++)
            {
                if ($matches['1'][$i] != '')
                {
                    $indexes[] = $matches['1'][$i];
                }
            }
            switch(count($indexes))
            {
                case 2:
                    return isset($_POST[$indexes[0]][$indexes[1]]) AND ($_POST[$indexes[0]][$indexes[1]] != '');
                    break;
                case 3:
                    return isset($_POST[$indexes[0]][$indexes[1]][$indexes[2]]) AND ($_POST[$indexes[0]][$indexes[1]][$indexes[2]] != '');
                    break;
                case 4:
                    return isset($_POST[$indexes[0]][$indexes[1]][$indexes[2]][$indexes[3]]) AND ($_POST[$indexes[0]][$indexes[1]][$indexes[2]][$indexes[3]] != '');
                    break;
                case 5:
                    return isset($_POST[$indexes[0]][$indexes[1]][$indexes[2]][$indexes[3]][$indexes[4]]) AND ($_POST[$indexes[0]][$indexes[1]][$indexes[2]][$indexes[3]][$indexes[4]] != '');
                    break;
            }
        }
        else
        {
            if ( ! isset($_POST[$field]))
            {
                return FALSE;
            }
            return (isset($_POST[$field]) AND ($_POST[$field] != ''));
        }
    }
    // --------------------------------------------------------------------
}

// END Form Validation Class

/* End of file Form_validation.php */
/* Location: ./application/libraries/Form_validation.php */
10
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
21