4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

CakePHP4のasciiAlphaNumericについて

Last updated at Posted at 2020-02-21

CakePHP2,3系では、alphaNumericが、日本語を通してしまう問題がありました。

CakePHP4では、asciiAlphaNumericが用意されたため、半角英数字のみを受け入れるバリデーションが出来ます。

##ここまでの過程

【参考】

英数字のみを受け入れるフォームを作りたいときに、CakePHPのalphaNumericバリデーションを使って実装すれば簡単だと思っていました。

しかし・・

日本語がバリデーションをスルスル通過する(泣)

調査していくと、CakePHP2,3系も同様の問題を抱えていて、例えば、2,3系では、カスタムバリデーションを自分で書いて日本語などの全角文字を防いでいたりと、他のアプローチで対応する必要がありました。

alphaNumericは、CakePHP2,3では以下のようになっています。

Validation.php
    public static function alphaNumeric($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');
    }

以下が4系のalphaNumericです。

4系でもalphaNumericバリデーションは、日本語を通す挙動になっていました。

Validation.php
    public static function alphaNumeric($check): bool
    {
        if ((empty($check) && $check !== '0') || !is_scalar($check)) {
            return false;
        }

        return self::_check($check, '/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du');
    }

4系のalphaNumericには、!is_scalar($check)が追加されています。

!is_scalar($check)は、値がスカラー値かどうかをチェックするメソッドです。スカラーに関しては、下記の記事が分かりやすいです。

スカラーについての記事

スカラー値の判定をすることで、配列などもチェックされるようになりました。

##alphaNumericとasciiAlphaNumericの違いは?

こちらがasciiAlphaNumericバリデーションです。

Validation.php
     public static function asciiAlphaNumeric($check): bool 
     { 
         if ((empty($check) && $check !== '0') || !is_scalar($check)) { 
             return false; 
         } 
         return self::_check($check, '/^[[:alnum:]]+$/'); 
     } 

なぜalphaNumericは、日本語が通過してしまうのだろうと思い調査してみました。

alphaNumericは内部で、/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Duという正規表現を通しています。

この正規表現は、日本語を通過してしまいます。

それに対して、asciiAlphaNumericは内部で /^[[:alnum:]]+$/という正規表現を通しています。

これにより、日本語が通過しなくなりました。

最後まで読んでくださり、ありがとうございました。

4
1
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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?