1. ホーム
  2. PHP

【PHP】filter_var の使い方|メール・URL・整数のバリデーションを解説

Share

フォームから送られてきたメールアドレスが本当にメール形式か、入力された値が整数か——こうした「値のチェック(バリデーション)」を、正規表現を自分で書かずに行えるのが PHP の filter_var です。あらかじめ用意されたフィルターを指定するだけで、メール・URL・整数・IPアドレスなどの検証や整形ができます。この記事では、filter_var の基本の使い方から、よく使うフィルターの種類、オプションで範囲を絞る方法、そして戻り値の落とし穴までを、実際のコードとともに解説します。

filter_var の基本

filter_varfilter_var($値, $フィルター) の形で使います。第2引数に検証したい内容に応じたフィルターの定数を渡します。まずは定番のメールアドレスの検証を見てみましょう。

example.php
<?php
// 正しいメール形式なら、その文字列が返る
$result = filter_var('user@example.com', FILTER_VALIDATE_EMAIL);
var_dump($result); // string(16) "user@example.com"

// 形式が不正なら false が返る
$result = filter_var('not-an-email', FILTER_VALIDATE_EMAIL);
var_dump($result); // bool(false)

FILTER_VALIDATE_EMAIL は「メールアドレスの形式か」を検証するフィルターです。妥当ならその値そのものを返し、不正なら false を返します。この「妥当なら値、ダメなら false」という戻り方が filter_var の基本パターンで、if と組み合わせて使います。

validate.php
<?php
$email = $_POST['email'] ?? '';

if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo '有効なメールアドレスです';
} else {
    echo 'メールアドレスの形式が正しくありません';
}

よく使うフィルターの種類

フィルターには大きく分けて、値が正しい形式かを調べる検証フィルター(VALIDATE 系)と、危険な文字などを取り除いて整える整形フィルター(SANITIZE 系)があります。よく使うものを表にまとめます。

フィルター用途
FILTER_VALIDATE_EMAILメールアドレスの形式を検証
FILTER_VALIDATE_URLURL の形式を検証
FILTER_VALIDATE_INT整数かどうかを検証
FILTER_VALIDATE_FLOAT小数(浮動小数点数)かを検証
FILTER_VALIDATE_IPIPアドレスの形式を検証
FILTER_SANITIZE_EMAILメールに使えない文字を除去
FILTER_SANITIZE_NUMBER_INT数字と符号以外を除去

URL と整数の検証も、メールと同じ書き方でできます。

others.php
<?php
// URL の検証
var_dump(filter_var('https://example.com', FILTER_VALIDATE_URL));
// string(19) "https://example.com"

// 整数の検証(文字列 "123" も整数として通る)
var_dump(filter_var('123', FILTER_VALIDATE_INT)); // int(123)
var_dump(filter_var('12.5', FILTER_VALIDATE_INT)); // bool(false)

注目したいのは、FILTER_VALIDATE_INT が文字列 '123' を整数 123 に変換して返す点です。フォームから送られてくる値は数字であっても文字列型なので、検証と同時に整数型で受け取れるのは便利です。小数の '12.5' は整数ではないため false になります。

オプションで範囲や条件を指定する

第3引数にオプションの配列を渡すと、より細かい条件を指定できます。たとえば整数の検証で「1以上100以下」に限定する、といった使い方です。'options' キーの中に min_rangemax_range を書きます。

range.php
<?php
$options = [
    'options' => [
        'min_range' => 1,
        'max_range' => 100,
    ],
];

var_dump(filter_var('50', FILTER_VALIDATE_INT, $options));  // int(50)
var_dump(filter_var('150', FILTER_VALIDATE_INT, $options)); // bool(false)(範囲外)

50 は範囲内なので int(50) が返り、150 は上限を超えているため false になります。ページ番号や個数のように「取りうる値の範囲が決まっている」入力の検証にぴったりです。同様に、IPアドレスの検証で FILTER_FLAG_IPV4 を付けて IPv4 に限定するなど、フィルターごとにフラグを指定することもできます。

戻り値の落とし穴:0 と false

filter_var を使うときに必ず知っておきたいのが、0false の扱いです。整数の検証で入力が 0 のとき、戻り値は整数の 0 になります。ところが 0if 文では「偽」と判定されるため、単純な条件分岐だと「検証に失敗した」と誤って扱ってしまいます。

pitfall.php
<?php
$value = filter_var('0', FILTER_VALIDATE_INT);

// ❌ これだと 0 のとき「失敗」と誤判定される
if ($value) {
    echo '有効';
} else {
    echo '無効'; // "0" は有効な整数なのに、ここに来てしまう
}

// ✅ === false で「失敗したか」を厳密に判定する
if ($value === false) {
    echo '無効';
} else {
    echo '有効'; // 0 でも正しく「有効」になる
}

正しくは === false を使い、「検証に失敗したかどうか」を厳密に判定します。0'0'・空文字なども有効な値になりうる整数や文字列を扱うときは、戻り値を === false と比較するのが安全です。この一点を守るだけで、思わぬバグを防げます。

バリデーションとサニタイズは目的が違う

filter_var には検証(VALIDATE)と整形(SANITIZE)の両方がありますが、役割は異なります。VALIDATE は「正しい形式かを判定する」もので、値は変えず合否だけを返します。SANITIZE は「不要・危険な文字を取り除いて整える」もので、値そのものを加工します。

入力チェックの基本は、まず VALIDATE で形式を確かめることです。なお、filter_var はあくまで「形式が正しいか」を見るもので、たとえば FILTER_VALIDATE_EMAIL を通っても、そのメールアドレスが実在するとは限りません。また、ユーザー入力を HTML として出力する際は、filter_var のサニタイズだけに頼らず、表示時に htmlspecialchars でエスケープする、データベースにはプリペアドステートメントを使う、といった対策も併せて行うことが大切です。

まとめ

filter_var は、正規表現を書かずにメール・URL・整数などの検証や整形ができる便利な関数です。filter_var($値, FILTER_VALIDATE_~) の形で使い、妥当なら値、不正なら false が返ります。第3引数のオプションで min_rangemax_range など範囲も指定できます。注意点は戻り値の判定で、0 のような値を扱うときは必ず === false で厳密に比較しましょう。VALIDATE は形式チェック、SANITIZE は整形と役割が違うことも押さえておくと、入力チェックを安全に組み立てられます。

参考ページ