1. 本記事のポイント
- PHPでのメールアドレスや数値の型チェック方法を整理
filter_varやis_numericの使い方と挙動を実例で紹介- 実務での選定基準や使い分けのポイントを明示
2. PHPの型チェック処理とは?
PHPでは、入力値が期待する形式(例:メールアドレスや整数など)かどうかをチェックする手段として、型チェック処理(バリデーション)を行います。
WebフォームやAPI経由で受け取った値は基本的にすべて文字列として扱われるため、意図しない値の混入を防ぐためにも明示的な検証が重要です。
特に数値やメールアドレスなどの”形式が決まっている値”では、型チェックの有無によってアプリケーションの信頼性に大きく影響します。
PHPでは、filter_var()やis_numeric()、ctype_digit()、正規表現など、複数の方法でチェックが可能です。用途や入力元に応じて、適切な手法を選ぶ必要があります。
3. 詳細解説
数値のチェック(整数・小数)
フォームから送られた値が数値かどうかを確認したい場合、次のような方法があります。
is_numeric(): 数値判定(整数・小数ともOK)
$value = '123.45';
// is_numericは整数・小数・数値形式の文字列を許容
if (is_numeric($value)) {
echo "数値です";
} else {
echo "数値ではありません";
}
出力結果:
数値です
is_numeric()は、"123" や "3.14" などの数値表現の文字列も真と判定するため、
フォーム入力値の初期チェックなどで広く使われます。
ctype_digit(): 整数のみ(文字列前提)
$value = '123';
// ctype_digitは"整数の文字列"のみ許容
if (ctype_digit($value)) {
echo "整数です";
} else {
echo "整数ではありません";
}
出力結果:
整数です
ctype_digit()は、小数やマイナス記号を含む値(例:”-12″、”3.14″)をすべて偽と判定します。
したがって、IDや数量など正の整数限定の用途で使われるケースが多いです。
メールアドレスのチェック
filter_var(): FILTER_VALIDATE_EMAIL
$email = 'user@example.com';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "正しいメール形式です";
} else {
echo "無効なメールアドレスです";
}
出力結果:
正しいメール形式です
filter_var()関数は、PHPに組み込まれたフィルタリング機構で、FILTER_VALIDATE_EMAILを使えば、基本的なメール形式を自動的に検証できます。
HTMLのpattern属性やJavaScriptでのチェックと併用して、
サーバーサイドでも確実な検証を行うのが一般的です。
filter_varと正規表現の違い
メールやURLなどの形式は、filter_varのようなビルトインフィルタの方が信頼性とメンテナンス性が高くなります。
一方で、**カスタムな形式(例:特定ドメインのメールのみ)**をチェックしたい場合は、正規表現を使う方が柔軟です。
$email = 'admin@example.co.jp';
// 「.co.jp」ドメインのみ許可する例
if (preg_match('/^[\w.-]+@([\w-]+\.)+co\.jp$/', $email)) {
echo ".co.jpドメインのメールです";
} else {
echo "対象外のメール形式です";
}
出力結果:
.co.jpドメインのメールです
4. よくあるミス・誤解・落とし穴
is_numeric()は、"0123"のような0埋め文字列も真と判定するため、ID用途には不適切です。ctype_digit()は、数値としては使えない" 123"や"+123"も偽と判定します。前処理が必要な場合があります。filter_var()によるメールチェックは、RFCに準拠しておらず、特殊なアドレス(例:引用符付き)を弾く場合があります。- 数値チェックに正規表現を使うと、意図せぬ例外や空白の扱いでエラーが発生しやすいため、ビルトイン関数の利用が推奨されます。
5. まとめ
PHPにおける型チェックは、ユーザー入力の信頼性を担保するために不可欠です。
数値にはis_numericやctype_digit、メールアドレスにはfilter_varを使い分けることで、安全性と可読性の高いコードが実現できます。
用途ごとの特性と制限を理解したうえで、最適な手段を選定しましょう。

