CakePHPのヴァリデーション『alphaNumeric』について

コラム以外の更新が滞ってましたが…再開します。

その再開第1弾は、CakePHPのヴァリデーションルール『alphaNumeric』について。
既に、色々なブログ等にも書いてある内容ですし、経験済みの方も多いかもしれませんが。。。
実は、全角文字を通してしまうんです。

以下は、まだご存じない方のために書きますね。

名称からも察することができる通り、英数字のみ許可したい場合にヴァリデーションルールとして用いるためのもので、
チュートリアルにも当然、同様のことが書いてあります。しかし、残念なことに全角も通しちゃうんですよね。。。

こちらが、コアライブラリに書いてあるプログラムの抜粋。

/**
* Checks that a string contains only integer or letters
*
* Returns true if string contains only integer or letters
*
* $check can be passed as an array:
* array('check' => 'valueToCheck');
*
* @param string|array $check Value to check
* @return boolean Success
*/
public static function alphaNumeric($check) {
    if (is_array($check)) {
        extract(self::_defaults($check));
    }

    if (empty($check) && $check != '0') {
        return false;
    }
    return self::_check($check, '/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du');
}

正規表現の中に、全角を通してしまう内容が書かれていることが原因のよう。

※詳しくは、こちらのブログを参照。
バリデーションalphaNumericは全角も通ってしまう – ichiichininiblog

そこで、私の場合はAppMode.phpで、以下のようにオーバーライドしています。

public function alphaNumeric($check) {
	$value = array_values($check);
	return preg_match('/^[a-zA-Z0-9]+$/', $value[0]);
}

※CakePHP 2.xの場合

これで、半角英数字のみ有効なヴァリデーションルールになります。

いくつかのブログでもこのやり方が紹介されているし、実際自分で試してみて、想定通りのヴァリデーションがかかっているので、多分大丈夫だと思います。

お見積もりフォーム