【PHP8.x】filter_var()関数の使い方
filter_var関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『filter_var関数は、指定したフィルタを使って変数を検証(バリデーション)または無害化(サニタイズ)する処理を実行する関数です。この関数は、主にユーザー入力などの外部から受け取ったデータを安全かつ期待する形式で扱うために利用されます。第一引数に処理したい変数を、第二引数に適用するフィルタの種類をFILTER_VALIDATE_EMAILのような定義済み定数で指定します。フィルタには大きく分けて2種類あり、「検証フィルタ」はデータが特定の形式(メールアドレス、URL、数値など)に合致しているかを確認します。形式が正しい場合はそのデータを、正しくない場合はfalseを返します。一方、「無害化フィルタ」はデータから不要または潜在的に危険な文字(HTMLタグなど)を除去したり、特定の形式に変換したりします。処理に失敗した場合はfalseが返されるため、例えばフィルタリング後の値が0の場合と処理に失敗した場合を区別するには、戻り値の評価に厳密な比較演算子(===)を使用することが重要です。
構文(syntax)
1<?php 2$email = "test@example.com"; 3$isValidEmail = filter_var($email, FILTER_VALIDATE_EMAIL); 4?>
引数(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メールを検証する
1<?php 2 3/** 4 * Eメールアドレスが有効な形式か検証し、結果を表示します。 5 * 6 * @param string $email 検証するEメールアドレス 7 * @return void 8 */ 9function checkEmailAddress(string $email): void 10{ 11 // filter_var() 関数と FILTER_VALIDATE_EMAIL フィルタを使用してEメールを検証します。 12 // 検証に成功した場合、この関数はEメールアドレスの文字列そのものを返します。 13 // 検証に失敗した場合、この関数は bool 値の false を返します。 14 $validatedEmail = filter_var($email, FILTER_VALIDATE_EMAIL); 15 16 if ($validatedEmail === false) { 17 echo "入力値 '{$email}' は、有効なEメールアドレスの形式ではありません。" . PHP_EOL; 18 } else { 19 echo "入力値 '{$validatedEmail}' は、有効なEメールアドレスの形式です。" . PHP_EOL; 20 } 21} 22 23// 検証対象のEメールアドレスの配列 24$emailsToTest = [ 25 'test@example.com', // 有効な例 26 'user.name+tag@domain.co.jp',// 有効な例 27 'invalid-email-format', // 無効な例 28 'test@.com', // 無効な例 29 '@example.com', // 無効な例 30]; 31 32// 配列内の各Eメールアドレスを検証 33foreach ($emailsToTest as $email) { 34 checkEmailAddress($email); 35} 36 37?>
このサンプルコードは、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 でメールアドレスを検証する
1<?php 2 3/** 4 * メールアドレスのリストを検証し、結果を出力します。 5 * 6 * この関数は、filter_var と FILTER_VALIDATE_EMAIL を使用して、 7 * 与えられたメールアドレスの形式が有効かどうかをチェックします。 8 */ 9function checkEmailAddresses(): void 10{ 11 // 検証するメールアドレスのサンプルリスト 12 $emails = [ 13 'test@example.com', // 有効な形式 14 'invalid-email-address', // 無効な形式 15 'user.name+tag@domain.co.jp',// 有効な形式 16 'test@.invalid-domain', // 無効な形式 17 '' // 空文字列(無効) 18 ]; 19 20 echo "メールアドレスの検証を開始します。\n\n"; 21 22 foreach ($emails as $email) { 23 // filter_var() を使ってメールアドレスの形式を検証します。 24 // 第2引数に FILTER_VALIDATE_EMAIL を指定します。 25 // 検証に成功した場合はメールアドレス文字列を、失敗した場合は false を返します。 26 $validatedEmail = filter_var($email, FILTER_VALIDATE_EMAIL); 27 28 // 戻り値が false かどうかを厳密に比較 (===) して結果を判定します。 29 if ($validatedEmail === false) { 30 printf("「%s」は、有効なメールアドレス形式ではありません。\n", $email); 31 } else { 32 // 検証成功時は、サニタイズされた値が出力されることがあります。 33 printf("「%s」は、有効なメールアドレス形式です。\n", $validatedEmail); 34 } 35 } 36} 37 38// 関数を実行して結果を表示します。 39checkEmailAddresses();
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に準拠しているかをチェックするだけで、そのアドレスが実際に存在するかまでは保証しません。ユーザー登録などでメールアドレスの有効性を確実に確認したい場合は、別途、確認メールを送信するなどの仕組みが必要です。この関数はユーザーからの入力を安全に扱うための第一歩として有効ですが、その役割と限界を理解して使いましょう。
filter_varでURLを検証する
1<?php 2 3/** 4 * 指定されたURLが有効な形式であるかを検証します。 5 * 6 * filter_var関数とFILTER_VALIDATE_URLフィルターを使用して、 7 * URL文字列の構文がRFCに準拠しているかを確認します。 8 * 9 * @param string $url 検証するURL文字列。 10 * @return void 検証結果を標準出力に出力します。 11 */ 12function checkUrlValidity(string $url): void 13{ 14 // filter_var関数を使用してURLの有効性を検証します。 15 // FILTER_VALIDATE_URLは、URLが有効な構文であるかをチェックするフィルターです。 16 // 有効なURLの場合はサニタイズされたURL文字列を返し、無効な場合はfalseを返します。 17 $filteredUrl = filter_var($url, FILTER_VALIDATE_URL); 18 19 if ($filteredUrl === false) { 20 echo "無効なURLです: '{$url}'\n"; 21 } else { 22 echo "有効なURLです: '{$filteredUrl}'\n"; 23 } 24} 25 26// --- サンプルコードの実行例 --- 27 28// 有効なURLの例 29$validUrl1 = "https://www.php.net/"; 30checkUrlValidity($validUrl1); 31 32// パスやクエリパラメータを含む有効なURLの例 33$validUrl2 = "http://example.com/path/to/page.html?param=value#section"; 34checkUrlValidity($validUrl2); 35 36echo "\n"; // 区切り線 37 38// 無効なURLの例 39$invalidUrl1 = "これはURLではありません"; 40checkUrlValidity($invalidUrl1); 41 42// プロトコルがない無効なURLの例 43$invalidUrl2 = "www.google.com"; // filter_var(..., FILTER_VALIDATE_URL) はプロトコルを要求します 44checkUrlValidity($invalidUrl2); 45 46?>
filter_var関数は、PHPで変数やユーザーからの入力データを特定のルールに基づいて検証したり、安全な形式に変換(サニタイズ)したりするために使用される、非常に重要な関数です。ウェブアプリケーション開発において、セキュリティを向上させ、誤ったデータ処理を防ぐために活用されます。
この関数は主に三つの引数を取ります。最初の$valueは検証したい対象のデータ、二番目の$filterは適用する検証またはサニタイズのルール(フィルタータイプ)、そして三番目の$optionsは追加のオプションを指定します。戻り値としては、検証に成功し、条件を満たした場合はその値を、失敗した場合はfalseを返します。
サンプルコードでは、filter_var関数とFILTER_VALIDATE_URLというフィルターを組み合わせて使用しています。FILTER_VALIDATE_URLは、与えられた文字列がRFC(インターネット標準)に準拠した有効なURLの構文であるかどうかを厳密にチェックするルールです。例えば、http://やhttps://といったプロトコルが含まれているかどうかも検証の対象となります。
checkUrlValidity関数では、入力されたURLに対してfilter_var($url, FILTER_VALIDATE_URL)を実行し、その結果を$filteredUrlに代入しています。$filteredUrlがfalseであればURLは無効であると判断し、そうでない場合は有効なURLとして扱っています。これにより、"https://www.php.net/"のような完全なURLは有効と判定されますが、プロトコルを欠く"www.google.com"や単なるテキストは無効なURLとして区別される様子が確認できます。この関数を使うことで、アプリケーションに不正なURLが渡されるのを効果的に防ぐことができます。
filter_var関数とFILTER_VALIDATE_URLフィルターは、URLの構文がRFCに準拠しているかのみを検証します。実際にそのURLが存在するか、アクセス可能かはチェックしませんのでご注意ください。特に、http://やhttps://などのプロトコルが含まれていない文字列は無効と判断されます。無効なURLに対してはfalseが返されるため、結果の確認には厳密な比較演算子===を使い、falseと空文字列を混同しないようにすることが重要です。また、有効なURLが返された場合でも、安全性を高めるために一部の文字が除去(サニタイズ)されている可能性があります。
PHP filter_varでURLを検証する
1<?php 2 3/** 4 * 指定されたURLが有効な形式であるかを検証します。 5 * 6 * @param string $url 検証するURL文字列。 7 * @return string 検証結果を示すメッセージ。 8 */ 9function validateAndDisplayUrlStatus(string $url): string 10{ 11 // filter_var関数を使用してURLを検証します。 12 // FILTER_VALIDATE_URLは、与えられた文字列が有効なURL形式であるかを確認します。 13 if (filter_var($url, FILTER_VALIDATE_URL)) { 14 return "URL '{$url}' は有効です。"; 15 } else { 16 return "URL '{$url}' は無効です。"; 17 } 18} 19 20// --- 使用例 --- 21 22// 有効なURLの例 23echo validateAndDisplayUrlStatus("https://www.php.net/manual/ja/function.filter-var.php") . PHP_EOL; 24 25// 無効なURLの例 26echo validateAndDisplayUrlStatus("これは無効なURLです") . PHP_EOL; 27 28// スキームのないURL (通常は無効と判断される) 29echo validateAndDisplayUrlStatus("www.example.com") . PHP_EOL; 30 31// ローカルホストのURL (有効と判断されることがある) 32echo validateAndDisplayUrlStatus("http://localhost:8080/mypage") . PHP_EOL; 33
PHPのfilter_var関数は、入力されたデータが特定の形式に合致するかどうかを「検証」したり、セキュリティ上の問題となりうる要素を取り除いて「サニタイズ(無害化)」したりするために使用される、非常に便利な関数です。
このサンプルコードでは、URLが正しい形式であるかを検証する目的でfilter_var関数を使用しています。
第一引数$valueには、検証したい文字列(この場合はURL)を渡します。第二引数$filterには、どのような検証ルールを適用するかを指定する定数を渡します。ここでは、URLの有効性を確認するためのFILTER_VALIDATE_URLを指定しています。
filter_var関数の戻り値は、検証の結果によって異なります。FILTER_VALIDATE_URLの場合、検証に成功してURLが有効な形式であれば、入力されたURL文字列そのものが返されます。一方、検証に失敗してURLが無効な形式であった場合はfalseが返されます。
サンプルコード内のvalidateAndDisplayUrlStatus関数では、このfilter_var関数の戻り値を利用し、URLが有効であれば「有効です」、無効であれば「無効です」というメッセージを生成して返しています。提供されている様々なURLの例を実行することで、実際にどのようにURLの有効性が判定されるかを確認でき、不正なデータからシステムを保護する基本的な方法を理解できます。
filter_var関数は、URLが「形式として」正しいかを確認するもので、そのURLが実際に存在するかやアクセスできるかまでは検証しません。サンプルコードのように、http://やhttps://といったスキームがないURLは、デフォルトでは無効と判断されやすい点に注意が必要です。この関数は入力値の基本的な検証に役立ちますが、検証を通過したURLをデータベースに保存したりHTMLに出力したりする際は、クロスサイトスクリプティング(XSS)などのセキュリティリスクを防ぐため、別途サニタイズやエスケープ処理を必ず検討してください。これは、安全なシステムを構築する上で不可欠な工程です。