フォームからの入力値が正の整数か判別する

PHPでの整数値か否かの判別、is_int()でいいじゃんと思ってたらダメだった。

PHPマニュアルのis_int()の解説より抜粋↓
変数が数値もしくは数値形式の文字列の場合 (フォームからの入力の場合は 常に文字列となります) 、 is_numeric() を使用する必要があります。
整数か判別したい場合というのはフォームからの入力値の場合が多いだけど、is_int()では、フォームからの入力値の全てにfalseを返してしまう。

では、is_numeric()ならいいのかというと、整数の判別の場合には問題がある。is_numeric()は、小数や負の数、16進表記(0xFF等)にもtrueを返してしまう。整数だけ判別したい。それも、できるだけ楽して。どうするか?

ctype_digit(strval($input))
というのが、現在の私の答え。ctype_digit()は、与えられた文字列のすべての文字が数字であるかどうかを調べる。
ctype_digit('1') // true
ctype_digit(1) // false
ctype_digit('-1') // false
ctype_digit('1.1') // false
ctype_digit('0xff') // false
引数が文字列でない場合はfalseが返るので、strval()で文字列に変換している。



13/2/25追記

手軽といえば、正規表現を使うのが一番手軽かも。preg_match('/[^0-9]/', $input) でも、ctype_digit(strval($input)) と同じ判定をできる。ただし、ctype_digit(strval($input)) とpreg_match('/[^0-9]/', $input) を比較すると、ctype_digitの方が67%ほど速い。