【PHP8.x】FILTER_VALIDATE_DOMAIN定数の使い方
FILTER_VALIDATE_DOMAIN定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
FILTER_VALIDATE_DOMAIN定数は、PHPのフィルタリング機能において、入力された値が有効なドメイン名であるかを検証するために使用される定数です。この定数は、主にfilter_var()関数やfilter_input()関数といったフィルタリング関数に、検証の種類を指定する引数として渡されます。
具体的には、Webアプリケーションなどでユーザーから送信された文字列が、インターネットのドメイン名として正しい形式を持っているかをチェックする際に利用されます。例えば、「example.com」のような一般的なドメイン名や、数字のみのドメイン名、国際化ドメイン名(IDN)などが、RFC(Request for Comments)に準拠した形式であるかを判断します。
filter_var()関数でこの定数を指定して値を検証した場合、入力された文字列が有効なドメイン名であれば、そのドメイン名がそのまま返されます。もし無効なドメイン名であったり、ドメイン名として認識できない文字列であった場合は、falseが返されます。これにより、プログラムは不正な形式のドメイン名を受け入れることなく、データの整合性を保ち、セキュリティを向上させることができます。特に、Webサイトのフォームからドメイン名の入力を受け付ける際などに、入力値の正確性を保証するために非常に役立つPHPの機能の一つです。
構文(syntax)
1<?php 2$domain_name = "example.com"; 3$is_valid_domain = filter_var($domain_name, FILTER_VALIDATE_DOMAIN); 4?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
FILTER_VALIDATE_DOMAINは、ドメイン名のバリデーションを実行するための定数です。この定数が返されると、指定された値が有効なドメイン名として認識されたことを示します。
サンプルコード
PHP filter_var でドメインを検証する
1<?php 2 3/** 4 * 渡された文字列が有効なドメイン名であるかを検証するサンプル関数です。 5 * FILTER_VALIDATE_DOMAIN 定数を使用して、filter_var() 関数でドメインを検証します。 6 * 7 * @param string $domain 検証するドメイン名文字列。 8 * @return void 9 */ 10function validateDomainExample(string $domain): void 11{ 12 // filter_var() 関数を使ってドメイン名を検証します。 13 // FILTER_VALIDATE_DOMAIN は、ドメイン名が有効な形式であるかをチェックします。 14 // RFCs 1034, 1035, 952 (ホスト名とIPアドレスの関連) に準拠します。 15 // TLD (トップレベルドメイン) は必須ですが、ホスト名にIPアドレスは許可されません。 16 // 例えば、'example.com' は有効ですが、'localhost' も有効とみなされます。 17 // 'http://example.com' のようなURL形式は、ドメインとしては無効と判断されます。 18 if (filter_var($domain, FILTER_VALIDATE_DOMAIN)) { 19 echo "ドメイン '{$domain}' は有効です。\n"; 20 } else { 21 echo "ドメイン '{$domain}' は無効です。\n"; 22 } 23} 24 25// サンプルとしていくつかのドメインを検証します。 26echo "--- ドメイン検証の例 ---\n"; 27 28// 有効なドメインの例 29validateDomainExample('example.com'); 30validateDomainExample('sub.example.co.jp'); 31validateDomainExample('localhost'); // 特殊なドメインですが、RFCに則り有効とみなされます 32validateDomainExample('xn--fsq.example.com'); // Punycode (国際化ドメイン名) も有効です 33 34// 無効なドメインの例 35validateDomainExample('invalid-domain'); // TLDがないため無効 36validateDomainExample('example..com'); // ドットが連続しているため無効 37validateDomainExample('http://example.com'); // URL形式なので、ドメインとしては無効 38validateDomainExample('192.168.1.1'); // IPアドレスなので、ドメインとしては無効 39validateDomainExample(''); // 空文字列は無効 40 41echo "------------------------\n"; 42 43?>
このPHPのサンプルコードは、渡された文字列が有効なドメイン名であるかを検証する方法を示しています。PHP 8で提供されるfilter_var()関数とFILTER_VALIDATE_DOMAIN定数を組み合わせて使用します。
FILTER_VALIDATE_DOMAINは、与えられた文字列がドメイン名の形式として正しいかをチェックするための組み込み定数です。この定数を用いた検証は、インターネットの標準規格であるRFCs 1034, 1035, 952(ホスト名とIPアドレスの関連)に準拠しています。検証では、トップレベルドメイン(TLD)の存在が必須とされ、example.comのような形式は有効と判断されます。しかし、invalid-domainのようにTLDがない文字列や、example..comのようにドットが連続する形式は無効です。また、http://example.comのようなURL形式や、192.168.1.1のようなIPアドレスは、ドメイン名としては無効とみなされます。一方で、localhostや、国際化ドメイン名に対応するPunnycode(例: xn--fsq.example.com)は有効なドメインとして扱われます。
サンプルコード内のvalidateDomainExample関数は、引数として検証したいドメイン名を表す文字列(string $domain)を受け取ります。この関数は検証結果を直接返すのではなく、ドメインが有効か無効かのメッセージを画面に出力するため、戻り値はvoid(何も返さない)です。関数内部では、filter_var($domain, FILTER_VALIDATE_DOMAIN)が実行され、ドメインの形式が正しければ真を、そうでなければ偽を返します。これにより、初心者の方でもドメイン検証の基本的なロジックとPHPの強力な組み込み関数の利用法を理解することができます。
PHPのFILTER_VALIDATE_DOMAINは、RFCに基づきドメイン名の書式を検証します。IPアドレスや「http://example.com」のようなURL形式の文字列は、ドメインとしては無効と判断されます。トップレベルドメイン(TLD)がない文字列も無効です。「localhost」は特殊ですが有効とみなされます。この定数はドメインの「形式」のみをチェックし、実際にそのドメインが存在するか(DNS解決可能か)は確認しません。したがって、有効な形式のドメイン名だけを受け入れたい場合に安全に利用できます。
PHPでメールアドレスを検証する
1<?php 2 3/** 4 * メールアドレスの有効性を検証する関数。 5 * 6 * システムエンジニアを目指す初心者向けに、PHPの組み込み関数 `filter_var` と 7 * `FILTER_VALIDATE_EMAIL` 定数を使用して、メールアドレスが正しい形式であるか 8 * を確認する方法を示します。 9 * 10 * @param string $email 検証するメールアドレス文字列。 11 * @return bool メールアドレスが有効な形式であれば true、そうでなければ false。 12 */ 13function validateEmailAddress(string $email): bool 14{ 15 // filter_var 関数は、指定された変数にフィルタを適用します。 16 // FILTER_VALIDATE_EMAIL 定数は、RFC 822 に準拠した形式でメールアドレスを検証するために使用されます。 17 // 検証に成功した場合、filter_var はフィルタリングされたデータ (この場合は元のメールアドレス) を返します。 18 // 検証に失敗した場合、filter_var は false を返します。 19 // そのため、結果が false でないことを確認することで、メールアドレスの有効性を判断します。 20 return filter_var($email, FILTER_VALIDATE_EMAIL) !== false; 21} 22 23// 以下は、validateEmailAddress 関数を使ってメールアドレスを検証する例です。 24$emailAddresses = [ 25 "test@example.com", // 有効なメールアドレス 26 "invalid-email", // 無効な形式 27 "another.user+tag@sub.domain.co.jp", // 有効なメールアドレス (複雑な形式) 28 "user@.com", // ドメインが不完全で無効 29 "user@localhost", // ローカルホストは通常有効とみなされる 30 "user@domain", // トップレベルドメインがないため無効 31]; 32 33echo "メールアドレスの検証結果:\n"; 34 35foreach ($emailAddresses as $email) { 36 if (validateEmailAddress($email)) { 37 echo sprintf("'%s' は有効なメールアドレスです。\n", $email); 38 } else { 39 echo sprintf("'%s' は無効なメールアドレスです。\n", $email); 40 } 41}
このPHPサンプルコードは、メールアドレスが正しい形式であるかを検証する方法を、システムエンジニアを目指す初心者向けに示しています。PHPには、特定のデータを検査したり整形したりするためのfilter_varという組み込み関数があります。
このコードでは、filter_var関数とFILTER_VALIDATE_EMAILという定数を組み合わせて使用しています。filter_var関数は、第一引数に検証したい文字列(ここではメールアドレス)、第二引数にどのような検証を行うかを指定するフィルター定数を取ります。FILTER_VALIDATE_EMAIL定数は、国際的なメールアドレスの標準規格(RFC 822)に沿ってメールアドレスの書式を厳密にチェックするために利用されます。
filter_var関数は、検証に成功した場合、フィルタリングされたデータ(この場合は元の有効なメールアドレス文字列)を戻り値として返します。しかし、メールアドレスが無効な形式であった場合、falseを返します。この挙動を利用して、filter_varの戻り値がfalseではないことを確認することで、メールアドレスが有効であるかどうかの真偽を判断しています。
サンプルコードでは、validateEmailAddressという関数を定義し、複数のメールアドレス文字列に対してこの検証処理を適用し、それぞれの結果を表示しています。これにより、有効なメールアドレスと無効なメールアドレスがどのように区別されるかを具体的に確認することができます。
このサンプルコードは、メールアドレスの書式がRFCに準拠しているか検証するものです。FILTER_VALIDATE_EMAILは一般的なメールアドレスの形式の妥当性を確認しますが、そのメールアドレスが実在するか、実際にメールが届くかまでは保証しません。これは書式チェックに過ぎないため、システム上で実在性を確認する際は、別途メールを送信して認証するなどの仕組みが必要となる場合があります。また、国際化ドメイン名(IDN)など、一部の特殊なメールアドレス形式には完璧に対応できない可能性もありますのでご注意ください。filter_var関数は検証成功時にフィルタリング後の値を、失敗時にfalseを返します。そのため、!== falseで厳密に比較することで、検証結果を正しく判断しています。