【PHP8.x】filter_var関数の使い方

作成日: 更新日:

『filter_var関数は、指定したフィルタを使って変数を検証(バリデーション)または無害化(サニタイズ)する処理を実行する関数です。この関数は、主にユーザー入力などの外部から受け取ったデータを安全かつ期待する形式で扱うために利用されます。第一引数に処理したい変数を、第二引数に適用するフィルタの種類をFILTER_VALIDATE_EMAILのような定義済み定数で指定します。フィルタには大きく分けて2種類あり、「検証フィルタ」はデータが特定の形式(メールアドレス、URL、数値など)に合致しているかを確認します。形式が正しい場合はそのデータを、正しくない場合はfalseを返します。一方、「無害化フィルタ」はデータから不要または潜在的に危険な文字(HTMLタグなど)を除去したり、特定の形式に変換したりします。処理に失敗した場合はfalseが返されるため、例えばフィルタリング後の値が0の場合と処理に失敗した場合を区別するには、戻り値の評価に厳密な比較演算子(===)を使用することが重要です。

基本的な使い方

構文(syntax)

<?php
$email = "test@example.com";
$isValidEmail = filter_var($email, FILTER_VALIDATE_EMAIL);
?>

引数(parameters)

mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0

  • mixed $value: フィルタリングする値。文字列、整数、配列など、様々な型の値を受け取れます。
  • int $filter = FILTER_DEFAULT: 適用するフィルタの種類を指定する整数。例えば、メールアドレスの検証には FILTER_VALIDATE_EMAIL を指定します。省略時は FILTER_DEFAULT となり、PHP の設定で定義されているデフォルトのフィルタが適用されます。
  • array|int $options = 0: フィルタのオプションを指定する配列または整数。フィルタの種類によって、許容される値の範囲やフォーマットなどを細かく設定できます。0 はオプションなしを意味します。

戻り値(return)

mixed

指定された値をフィルター処理またはサニタイズした結果を返します。フィルター処理に失敗した場合は false を返します。

サンプルコード

PHP filter_varでEメールを検証する

<?php

/**
 * Eメールアドレスが有効な形式か検証し、結果を表示します。
 *
 * @param string $email 検証するEメールアドレス
 * @return void
 */
function checkEmailAddress(string $email): void
{
    // filter_var() 関数と FILTER_VALIDATE_EMAIL フィルタを使用してEメールを検証します。
    // 検証に成功した場合、この関数はEメールアドレスの文字列そのものを返します。
    // 検証に失敗した場合、この関数は bool 値の false を返します。
    $validatedEmail = filter_var($email, FILTER_VALIDATE_EMAIL);

    if ($validatedEmail === false) {
        echo "入力値 '{$email}' は、有効なEメールアドレスの形式ではありません。" . PHP_EOL;
    } else {
        echo "入力値 '{$validatedEmail}' は、有効なEメールアドレスの形式です。" . PHP_EOL;
    }
}

// 検証対象のEメールアドレスの配列
$emailsToTest = [
    'test@example.com',          // 有効な例
    'user.name+tag@domain.co.jp',// 有効な例
    'invalid-email-format',      // 無効な例
    'test@.com',                 // 無効な例
    '@example.com',              // 無効な例
];

// 配列内の各Eメールアドレスを検証
foreach ($emailsToTest as $email) {
    checkEmailAddress($email);
}

?>

このサンプルコードは、PHPのfilter_var関数を使用して、指定された文字列が有効なEメールアドレスの形式であるかどうかを検証する方法を示しています。filter_var関数は、データの検証(バリデーション)や無害化(サニタイズ)を行うための強力な組み込み関数です。

この関数は、第一引数に検証したいデータ(この例では変数$email)を、第二引数に適用するフィルタの種類を指定します。サンプルコードでは、Eメールアドレスの形式を検証するための定義済みフィルタであるFILTER_VALIDATE_EMAILを使用しています。

この関数の特徴は、検証結果によって戻り値が異なる点です。検証に成功した場合、この関数は検証されたデータ、つまりEメールアドレスの文字列そのものを返します。一方、検証に失敗した場合は、論理値のfalseを返します。サンプル内のcheckEmailAddress関数では、この戻り値が厳密にfalseであるかを判定することで、形式が有効か無効かに応じて適切なメッセージを表示しています。このようにfilter_var関数は、ユーザーからの入力などを簡単かつ安全に検証する際に非常に便利です。

filter_var関数をEメール検証で使う際、戻り値のチェックには === false という厳密な比較を用いることが重要です。この関数は検証に失敗するとfalseを返しますが、成功した場合はEメールアドレスの文字列を返すため、== で比較すると意図しない結果を招く可能性があるからです。また、この検証はあくまでEメールアドレスの「形式」が正しいかを確認するものであり、そのアドレスが「実際に存在するか」や「メールを受信できるか」までは保証しません。そのため、ユーザー登録のような重要な機能では、この形式チェックに加えて、実際に確認メールを送信するなどの多段階の検証を組み合わせることが、より安全なシステムを構築するために推奨されます。

PHP: filter_var でメールアドレスを検証する

<?php

/**
 * メールアドレスのリストを検証し、結果を出力します。
 *
 * この関数は、filter_var と FILTER_VALIDATE_EMAIL を使用して、
 * 与えられたメールアドレスの形式が有効かどうかをチェックします。
 */
function checkEmailAddresses(): void
{
    // 検証するメールアドレスのサンプルリスト
    $emails = [
        'test@example.com',          // 有効な形式
        'invalid-email-address',     // 無効な形式
        'user.name+tag@domain.co.jp',// 有効な形式
        'test@.invalid-domain',      // 無効な形式
        ''                           // 空文字列(無効)
    ];

    echo "メールアドレスの検証を開始します。\n\n";

    foreach ($emails as $email) {
        // filter_var() を使ってメールアドレスの形式を検証します。
        // 第2引数に FILTER_VALIDATE_EMAIL を指定します。
        // 検証に成功した場合はメールアドレス文字列を、失敗した場合は false を返します。
        $validatedEmail = filter_var($email, FILTER_VALIDATE_EMAIL);

        // 戻り値が false かどうかを厳密に比較 (===) して結果を判定します。
        if ($validatedEmail === false) {
            printf("「%s」は、有効なメールアドレス形式ではありません。\n", $email);
        } else {
            // 検証成功時は、サニタイズされた値が出力されることがあります。
            printf("「%s」は、有効なメールアドレス形式です。\n", $validatedEmail);
        }
    }
}

// 関数を実行して結果を表示します。
checkEmailAddresses();

filter_var()関数は、変数の値が特定のルールに沿っているかを検証(バリデーション)したり、安全な形式に整えたり(サニタイズ)するための関数です。このサンプルコードでは、複数の文字列が有効なメールアドレスの形式であるかをfilter_var()を用いて判定しています。

filter_var()の第一引数には検証したいデータ(この例では変数$email)、第二引数には適用したいフィルタの種類を指定します。ここではFILTER_VALIDATE_EMAILという定数を指定することで、「メールアドレスとして有効な形式か」というルールで検証を行っています。

この関数の戻り値の挙動が重要です。検証に成功した場合、filter_var()は検証された値(この場合はメールアドレス文字列)を返します。しかし、指定された形式に合致しない場合や、値が空文字列であるなど検証に失敗した場合は、論理値のfalseを返します。

サンプルコードでは、この戻り値をif ($validatedEmail === false)という条件で判定しています。===演算子でfalseと厳密に比較することで、検証の成否を正確に判断し、結果に応じたメッセージを表示しています。このようにfilter_var()を使えば、複雑な処理を自前で実装することなく、簡単かつ安全にデータの検証が可能です。

filter_var関数でメールアドレスを検証する際、戻り値の扱いに注意が必要です。検証に失敗するとfalseが返るため、サンプルコードのように==ではなく厳密な比較演算子===を使って判定してください。これにより、空文字列のようなfalseと見なされうる値を誤って無効と判定するのを防げます。また、FILTER_VALIDATE_EMAILはメールアドレスの「形式」がRFCに準拠しているかをチェックするだけで、そのアドレスが実際に存在するかまでは保証しません。ユーザー登録などでメールアドレスの有効性を確実に確認したい場合は、別途、確認メールを送信するなどの仕組みが必要です。この関数はユーザーからの入力を安全に扱うための第一歩として有効ですが、その役割と限界を理解して使いましょう。

【PHP8.x】filter_var関数の使い方 | いっしー@Webエンジニア