PHPで数値なのかをチェックする方法はis_numeric()
での判定とpreg_match()
を使った正規表現での判定が多いですが、それぞれ判定がゆるかったり、処理が多少重いなど特長があります。
数値型しかtrue
判定しない厳密な関数や、数値判定に特化した関数など、4パターンご紹介します。
使いたい目的にあったものをチョイスしていきましょう。
それでは、それぞれの関数で型ごとにどのような判定になるか見ていきましょう。
目次
is_numeric関数
数字または数値形式の文字列か調べます。
文字列型でも小数点でも数値ならOK!(true
)判定してくれます。
is_numericで数値チェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// 型ごとに変数に格納 $str = '255'; // 文字列(string)型 $int = 255; // 整数(int)型 $flt = 255.99; // 浮動小数点(float)型 // 文字列(string)型の判定 if (is_numeric($str)) { echo '文字列string => OK!'; } else { echo '文字列string => ダメ!'; } // 整数(int)型 if (is_numeric($int)) { echo '整数int => OK!'; } else { echo '整数int => ダメ!'; } // 小数(float)型 if (is_numeric($flt)) { echo '小数float => OK!'; } else { echo '小数float => ダメ!'; } |
is_numericの判定
文字列string => OK!
整数int => OK!
小数float => OK!
文字列も整数も浮動小数点も全部OK!(true
)判定してくれました。
is_int関数
整数(int)型か調べてくれます。
数値でも文字列型だとダメ!(false
)判定なので、厳しいです。
is_intでint型かチェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// 型ごとに変数に格納 $str = '255'; // 文字列(string)型 $int = 255; // 整数(int)型 $flt = 255.99; // 浮動小数点(float)型 // 文字列(string)型の判定 if (is_int($str)) { echo '文字列string => OK!'; } else { echo '文字列string => ダメ!'; } // 整数(int)型の判定 if (is_int($int)) { echo '整数int => OK!'; } else { echo '整数int => ダメ!'; } // 小数(float)型の判定 if (is_int($flt)) { echo '小数float => OK!'; } else { echo '小数float => ダメ!'; } |
is_intの判定
文字列string => ダメ!
整数int => OK!
小数float => ダメ!
整数だけOK!(true
)で文字列や小数点はダメ!(false
)でした。
HTMLフォームからPOSTされた数値は文字列型なので、in_int()
ではバリデートできません。
厳密にint型かを判定する場合に使用しましょう。
preg_match関数
正規表現で自由に数値チェックできます。
preg_matchの正規表現での数値判チェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// 型ごとに変数に格納 $str = '255'; // 文字列(string)型 $int = 255; // 整数(int)型 $flt = 255.99; // 浮動小数点(float)型 // 文字列(string)型の判定 if (preg_match('/^[0-9]+$/', $str)) { echo '文字列string => OK!'; } else { echo '文字列string => ダメ!'; } // 整数(int)型の判定 if (preg_match('/^[0-9]+$/', $int)) { echo '整数int => OK!'; } else { echo '整数int => ダメ!'; } // 小数(float)型の判定 if (preg_match('/^[0-9]+$/', $slt)) { echo '小数float => OK!'; } else { echo '小数float => ダメ!'; } |
preg_matchの判定
文字列string => OK!
整数int => OK!
小数float => ダメ!
preg_match()
は記述した正規表現によって変わってきますが、小数を除く数値であれば文字列型、int型問わず判定してくれます。
この方法はメジャーですが、preg_match()
による正規表現の処理は重いからと避ける人もいるようです。
ctype_digit関数
文字列が数字かどうか調べてくれます。
文字列を判定する関数で、整数int型だとfalse
判定になるこることもあるため、文字列のみを指定するようにしましょう。
ctype_digitで数字かチェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// 型ごとに変数に格納 $str = '255'; // 文字列(string)型 $int = 255; // 整数(int)型 $flt = 255.99; // 浮動小数点(float)型 // 文字列(string)型の判定 if (ctype_digit($str)) { echo '文字列string => OK!'; } else { echo '文字列string => ダメ!'; } // 整数(int)型の判定 if (ctype_digit($int)) { echo '整数int =>OK!'; } else { echo '整数int => ダメ!'; } // 小数(float)型の判定 if (ctype_digit($flt)) { echo '小数float => OK!'; } else { echo '小数float => ダメ!'; } |
ctype_digitの判定
文字列string => OK!
整数int => ダメ!
小数float => ダメ!
文字列型の整数であればOK!(true
)、小数点は文字列でもダメ!(false
)となります。
int型だと255文字以下では一部数値を除いてダメ!(false
)になることが多く、256文字以上はOK!(true
)となりますが、基本的には文字列型での判定のみに使用すべきでしょう。
HTMLフォームからPOSTされた数値であれば文字列型となるため、バリデーションには使えますね。
数値チェックのまとめ
数値チェックの方法を4タイプ見ていきましたが、以下の一覧表にまとめました。
数値チェック一覧表
関数名 | 文字列(string)型 '255' | 整数(int)型 255 | 浮動小数点(float)型 255.99 |
---|---|---|---|
is_numeric | OK! (TRUE) | OK! (TRUE) | OK! (TRUE) |
is_int | ダメ! (FALSE) | OK! (TRUE) | ダメ! (FALSE) |
preg_match (/^[0-9]+$/) | OK! (TRUE) | OK! (TRUE) | ダメ! (FALSE) |
ctype_digit | OK! (TRUE) | 基本ダメ! (FALSE) | ダメ! (FALSE) |
今回、型によって動作が変わるものもありましたが、PHPは型を意識せずコーディングできるため、逆に型によってハマることも多いものです。
PHPといえども型を意識してコーディングするよう心がけたいものですね。
数値チェックにもいろいろな方法があり、それぞれ特長がありますので、プログラムの内容に合ったチェック方法を採用しましょう。
※ctype_digitに関してはTwitter上で誤りのご指摘があり、再修正させていただきました。
これまで当記事をご覧頂いた方には認識の誤った記事を掲載しましたことをお詫び申し上げます。誠に申し訳ございません。
また、ご指摘いただいた方にはこの場を借りて御礼申し上げます。