PHPでは、ドメイン名が正しい形式を満たしていることを確認するための一般的な要件です。通常、2つの方法で検証できます。1つはフォーマット検証に正規表現を使用することであり、もう1つはPHPの内蔵CheckDNSRR関数を介してドメイン名が存在するかどうかを確認することです。この記事では、これら2つの方法を詳細に調べ、それらを組み合わせてドメイン名の効果的な検証を実現する方法を紹介します。
正規表現は、文字列が指定されたパターンに準拠していることを迅速に確認する強力なツールです。ドメイン名形式を検証するときは、次の重要な要素を考慮する必要があります。
ドメイン名は、文字、数字、短い水平線とポイント( 。 )で構成されています。
各ラベル(ドットで部分的に分離)には、少なくとも1つの文字または番号が含まれている必要があり、短い水平線で開始または終了することはできません。
総長さは253文字を超えてはなりません。
ドメイン名形式を検証するための正規式の例を次に示します。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">validate_domain_format</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$domain</span></span></span><span>) {
</span><span><span class="hljs-variable">$pattern</span></span><span> = </span><span><span class="hljs-string">'/^(?!-)[A-Za-z0-9-]{1,63}(?<!-)\.(?!-)[A-Za-z0-9-]{1,63}(?<!-)$/'</span></span><span>;
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-variable">$pattern</span></span><span>, </span><span><span class="hljs-variable">$domain</span></span><span>);
}
</span></span>
^(?! - ) :ドメイン名が短い水平線( - )で始まっていないことを確認してください。
[a-za-z0-9-] {1,63} :ドメイン名(ラベル)の各部分には、長さが1〜63文字の文字、数字、短い水平線を含めることができます。
(?<! - ) :ドメイン名が短い水平線( - )で終わらないことを確認してください。
\。 :マッチポイント( 。 )文字。
この正規表現は、ドメイン名の各部分の合法性とフォーマットを保証します。
正規表現はドメイン名形式の正しさを検証できますが、ドメイン名が実際に存在することを確認することはできません。ドメイン名が有効であることを確認するために、PHPの内蔵CheckDnSRR関数を使用できます。これは、ドメイン名に対応するDNSレコードがあるかどうかを確認するために使用されます。有効なDNSレコードがある場合、ドメイン名が存在し、アクセス可能であることを意味します。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">check_domain_exists</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$domain</span></span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">checkdnsrr</span></span><span>(</span><span><span class="hljs-variable">$domain</span></span><span>, </span><span><span class="hljs-string">"A"</span></span><span>); </span><span><span class="hljs-comment">// 診る A 記録,ドメイン名が有効かどうかを意味します</span></span><span>
}
</span></span>
checkdnsrr($ domain、 "a") :この関数は、ドメイン名にAレコードがあるかどうか、つまりドメイン名に関連付けられたIPアドレスがあるかどうかを確認します。その場合は、ドメイン名が有効であることを示して、 trueを返します。
MXパラメーターを使用して、ドメイン名にメール交換レコードがあることを確認したり、任意のパラメーターを使用してDNSレコードのタイプがあるかどうかを確認することもできます。
ドメイン名の形式と存在を同時に確認するには、正規表現とCheckDnSRR関数の組み合わせを使用できます。次のコードは、この共同検証を実行する方法を示しています。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">validate_domain</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$domain</span></span></span><span>) {
</span><span><span class="hljs-comment">// 最初にドメイン名形式を確認します</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">validate_domain_format</span></span><span>(</span><span><span class="hljs-variable">$domain</span></span><span>)) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">"無効なドメイン名形式"</span></span><span>;
}
</span><span><span class="hljs-comment">// 然后診る域名是否存在</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">check_domain_exists</span></span><span>(</span><span><span class="hljs-variable">$domain</span></span><span>)) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">"ドメイン名は存在しません"</span></span><span>;
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">"ドメイン名は正しく、存在します"</span></span><span>;
}
</span></span>
<span><span><span class="hljs-variable">$domain</span></span><span> = </span><span><span class="hljs-string">"example.com"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">validate_domain</span></span><span>(</span><span><span class="hljs-variable">$domain</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>; </span><span><span class="hljs-comment">// 出力 "ドメイン名は正しく、存在します"</span></span><span>
</span></span>
国際化ドメイン名(IDN) :アプリケーションが国際化されたドメイン名(つまり、ASCII文字以外を含むドメイン名)をサポートする必要がある場合、 IDN_TO_ASCII()関数を使用して、検証する前にASCIIエンコードに変換できます。
ドメイン名の長さの制限:標準に応じて、ドメイン名の合計長さは253文字を超えてはなりません。ユーザーが入力したドメイン名がこの長さを超えた場合、追加のチェックが必要です。
エラー処理: CHECKDNSRR関数を呼び出すと、DNS解像度エラーが発生する可能性があるため、 @シンボルを使用してエラー出力を抑制し、実際の状況に応じてエラーを処理することをお勧めします。
正規表現とCHECKDNSRR関数を組み合わせることにより、PHP開発者はドメイン名の形式と存在を効率的に検証できます。正規表現は、ドメイン名形式が標準を満たしていることを保証し、 CHECKDNSRR関数はドメイン名が実際に存在するかどうかをさらに検証します。この2要素検証方法は、ドメイン名の検証の精度と信頼性を大幅に改善し、フォーマットエラーまたは無効なドメイン名によって引き起こされる問題を効果的に回避できます。