Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】FILTER_FLAG_IPV4定数の使い方

FILTER_FLAG_IPV4定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

FILTER_FLAG_IPV4定数は、PHPのフィルター機能において、入力された文字列がIPv4形式のIPアドレスであることを検証または処理する際に使用されるフラグを表す定数です。この定数は、主にfilter_var()関数などを用いてデータの検証やサニタイズ(無害化)を行う際に、特定の条件を指定するために利用されます。

具体的には、FILTER_VALIDATE_IPフィルターと組み合わせて使用することで、入力値が有効なIPアドレスであるかをチェックする際に、さらにそのIPアドレスがIPv4形式でなければならないという制約を追加できます。IPv4形式のIPアドレスは、例えば「192.168.1.1」のようなドットで区切られた4つの数値グループで構成される形式を指します。この定数を指定することで、意図しないIPv6アドレスや不正な文字列を排除し、プログラムが期待するIPv4形式のデータのみを受け入れることが可能になります。

ウェブアプリケーションなどでユーザーからの入力がIPアドレスであるべき場合、このFILTER_FLAG_IPV4定数を用いることで、データの整合性を保ち、セキュリティを向上させることができます。開発者はこの定数を活用することで、IPアドレスの厳密な入力チェックロジックを簡潔かつ正確に実装することが可能です。

構文(syntax)

1<?php
2$ip_address = "192.168.1.100";
3$is_ipv4 = filter_var($ip_address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

FILTER_FLAG_IPV4は、IPアドレスを検証する際にIPv4アドレスのみを対象とするための整数値定数です。

サンプルコード

PHPでIPv4アドレスを検証する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 指定された文字列が有効なIPv4アドレスであるかを検証します。
7 *
8 * PHPのfilter_var関数とFILTER_VALIDATE_IPフィルター、
9 * そしてFILTER_FLAG_IPV4フラグを使用して、厳密にIPv4形式のみをチェックします。
10 *
11 * @param string $ipAddress 検証するIPアドレス文字列
12 * @return bool 有効なIPv4アドレスであれば true、そうでなければ false
13 */
14function isValidIpv4Address(string $ipAddress): bool
15{
16    // filter_var関数は、指定された変数をフィルタリングします。
17    // 第一引数: 検証したい値 ($ipAddress)
18    // 第二引数: 使用するフィルタ (FILTER_VALIDATE_IP はIPアドレスの形式を検証)
19    // 第三引数: フィルタに渡すオプションやフラグ (FILTER_FLAG_IPV4 はIPv4形式のみを許可するフラグ)
20    $result = filter_var(
21        $ipAddress,
22        FILTER_VALIDATE_IP,
23        FILTER_FLAG_IPV4
24    );
25
26    // filter_var関数は、検証に成功した場合にフィルタリングされた値(この場合はIPアドレス文字列)を返します。
27    // 検証に失敗した場合は false を返します。
28    // そのため、結果が false と厳密に等しくないかをチェックすることで、成功・失敗を判定できます。
29    return $result !== false;
30}
31
32// --- サンプルコードの実行例 ---
33
34// 有効なIPv4アドレスの例
35$validIpv4 = "192.168.1.100";
36// 無効なIPv4アドレスの例 (オクテットの範囲外)
37$invalidIpv4Range = "192.168.1.256";
38// 無効なIPv4アドレスの例 (形式が異なる)
39$invalidIpv4Format = "192.168..1";
40// 有効なIPv6アドレスの例 (FILTER_FLAG_IPV4 があるため、この関数では無効と判定される)
41$validIpv6 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
42// IPアドレスではない文字列
43$notAnIp = "hello world";
44
45echo "--- IPv4アドレス検証の実行例 ---" . PHP_EOL;
46
47echo "'{$validIpv4}' は有効なIPv4アドレスですか? " . (isValidIpv4Address($validIpv4) ? "はい" : "いいえ") . PHP_EOL;
48echo "'{$invalidIpv4Range}' は有効なIPv4アドレスですか? " . (isValidIpv4Address($invalidIpv4Range) ? "はい" : "いいえ") . PHP_EOL;
49echo "'{$invalidIpv4Format}' は有効なIPv4アドレスですか? " . (isValidIpv4Address($invalidIpv4Format) ? "はい" : "いいえ") . PHP_EOL;
50echo "'{$validIpv6}' は有効なIPv4アドレスですか? " . (isValidIpv4Address($validIpv6) ? "はい" : "いいえ") . PHP_EOL;
51echo "'{$notAnIp}' は有効なIPv4アドレスですか? " . (isValidIpv4Address($notAnIp) ? "はい" : "いいえ") . PHP_EOL;
52
53?>

このコードは、与えられた文字列が有効なIPv4アドレスであるかを判定する方法を示しています。PHPのfilter_var関数を使用しており、この関数は、様々なデータの形式を検証・整形する強力なツールです。

filter_var関数は三つの引数を取ります。第一引数には検証したいIPアドレス文字列を指定します。第二引数には、IPアドレス形式の検証を行うための定数FILTER_VALIDATE_IPを指定します。そして、第三引数にFILTER_FLAG_IPV4という定数を指定することが重要です。このフラグにより、検証はIPv4形式のアドレスのみを対象とし、IPv6アドレスは無効と判断されます。もしこのフラグを指定しない場合、IPv6アドレスも有効と見なされる可能性があります。

filter_var関数は、検証に成功した場合はフィルタリングされた値(この場合は元のIPアドレス文字列)を返し、失敗した場合はfalseを返します。したがって、サンプルコードのisValidIpv4Address関数では、filter_var関数の戻り値がfalseではないことを確認することで、入力された文字列が有効なIPv4アドレスであるかを判定し、その結果をtrueまたはfalseで返しています。このようにFILTER_FLAG_IPV4を利用することで、プログラムが扱うIPアドレスの種類を明確に限定し、プログラムの正確性を高めることができます。

このサンプルコードでは、filter_var関数とFILTER_FLAG_IPV4を使って、入力された文字列が厳密にIPv4形式であるかを検証しています。特に、filter_var関数の戻り値がfalseと厳密に等しいかどうかで検証の成功・失敗を判断する点が重要です。成功時には元のIPアドレス文字列が、失敗時にはfalseが返されるため、!== falseで安全に判定できます。また、FILTER_FLAG_IPV4を使用しているため、たとえ有効なIPv6アドレスであっても、この関数では「無効なIPv4アドレス」として判定されます。IPv6アドレスも許可したい場合は、このフラグを指定しないか、FILTER_FLAG_IPV6を併用する必要があります。入力値は文字列として渡してください。

PHPでIPv4アドレスを検証する

1<?php
2
3/**
4 * 指定された文字列が有効なIPv4アドレスであるかを検証します。
5 *
6 * filter_var関数とFILTER_VALIDATE_IPフィルター、
7 * およびFILTER_FLAG_IPV4フラグを使用してIPv4形式に限定してチェックします。
8 *
9 * @param string $ipAddress 検証するIPアドレス文字列。
10 * @return bool 有効なIPv4アドレスであればtrue、そうでなければfalse。
11 */
12function isValidIpv4Address(string $ipAddress): bool
13{
14    // filter_var関数は、入力データをフィルタリングまたは検証するために使用されます。
15    // 第一引数: 検証するデータ ($ipAddress)。
16    // 第二引数: 適用するフィルターの種類 (FILTER_VALIDATE_IP)。これはIPアドレスとして有効かをチェックします。
17    // 第三引数: フィルターに適用するフラグ (FILTER_FLAG_IPV4)。
18    //           このフラグは、FILTER_VALIDATE_IPと組み合わせて使用され、検証をIPv4アドレスに限定します。
19    //
20    // filter_varは、検証が成功した場合はフィルタリングされたデータを返し、
21    // 失敗した場合は false を返します。
22    // この関数では、成功(false以外が返された)かどうかをチェックしています。
23    return filter_var($ipAddress, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false;
24}
25
26// サンプルコードとして、いくつかのIPアドレスを検証してみましょう。
27echo "--- IPv4アドレス検証の例 ---\n";
28
29$testIps = [
30    "192.168.1.1",       // 有効なIPv4アドレス
31    "255.255.255.0",     // 有効なIPv4アドレス
32    "127.0.0.1",         // 有効なIPv4アドレス (ループバック)
33    "2001:0db8::1",      // IPv6アドレス (FILTER_FLAG_IPV4があるため無効と判定される)
34    "not.an.ip.address", // 無効な形式
35    "192.168.1.256",     // 無効なIPv4アドレス (オクテットが255を超える)
36    "0.0.0.0",           // 有効なIPv4アドレス
37];
38
39foreach ($testIps as $ip) {
40    if (isValidIpv4Address($ip)) {
41        echo "'{$ip}' は有効なIPv4アドレスです。\n";
42    } else {
43        echo "'{$ip}' は有効なIPv4アドレスではありません。\n";
44    }
45}
46
47?>

このコードは、指定された文字列が有効なIPv4アドレスであるかを検証する方法を示しています。isValidIpv4Address関数は、検証対象のIPアドレス文字列を引数($ipAddress)として受け取り、有効なIPv4アドレスであればtrueを、そうでなければfalseを戻り値として返します。

この検証の中心となるのが、PHPのfilter_var関数です。filter_var関数は、入力データをフィルタリングまたは検証するために用いられ、第一引数に検証するデータ、第二引数に適用するフィルターの種類、第三引数にフィルターの挙動を調整するフラグを指定します。

サンプルコードでは、第二引数にIPアドレスとしての有効性をチェックするFILTER_VALIDATE_IPフィルターを指定しています。さらに、第三引数にFILTER_FLAG_IPV4定数を指定することで、IPアドレスの検証をIPv4形式に限定しています。これにより、IPv6アドレスや不適切な形式の文字列は無効と判断されます。

filter_var関数は、検証に成功した場合はフィルタリングされたデータ(この場合は元のIPアドレス文字列)を返し、失敗した場合はfalseを返します。この挙動を利用し、戻り値がfalseでないことを確認することで、有効なIPv4アドレスであるかを判定しています。サンプルコードの下部では、いくつかのIPアドレス文字列を実際に検証し、その結果を出力しています。

このサンプルコードは、PHPのfilter_var関数とFILTER_VALIDATE_IP、そしてFILTER_FLAG_IPV4を組み合わせることで、入力された文字列が厳密にIPv4アドレスのみであるかを検証する安全な方法を示しています。初心者が注意すべき点は、FILTER_FLAG_IPV4を指定しない場合、FILTER_VALIDATE_IPはIPv6アドレスも有効と判断してしまうことです。そのため、IPv4アドレスに限定したい場合は必ずこのフラグを使用してください。また、filter_var関数は検証に成功した場合はフィルタリングされた値を返し、失敗した場合にfalseを返しますので、結果を!== falseで比較することが正しい検証のポイントです。これにより、不正な形式のデータ入力を防ぎ、アプリケーションの堅牢性とセキュリティを向上させることができます。他の入力検証にも同様にfilter_var関数を活用できます。

関連コンテンツ

関連プログラミング言語