異なる利点を持つ2つの直接/一般的な方法を次に示します。
方法1:非正規表現アプローチ
function check_email1($email){
$whitelist_domains=['@domain1.com','@domain2.com','@domain3.com'];
foreach($whitelist_domains as $domain){
if(strpos($email,$domain)!==false){
return true; // allow quick return (exit loop & function asap)
}
}
return false; // default response
}
方法2:正規表現アプローチ
function check_email2($email){
$whitelist_pattern='/@(?:domain1\.com|domain2\.com|domain3\.com)$/'; // condense if possible /@domain[123]\.com$/
return (bool)preg_match($whitelist_pattern,$email); // convert 0 or 1 output to boolean (false/true)
}
デモリンク
入力/関数呼び出し:
$emails=['user@domain1.com','bad@bad.com'];
foreach($emails as $email){
echo "$email\n";
var_export(check_email1($email));
echo "\n";
var_export(check_email2($email));
echo "\n\n";
}
出力:
user@domain1.com
true
true
bad@bad.com
false
false
長所/短所:
ほとんどの状況でstrpos()は、正規表現関数よりもパフォーマンスが優れています。デフォルトの方法は、文字列関数を使用し、文字列関数の効率が低いか、コードが複雑すぎる場合にのみ正規表現に変更することです。関連ページ:PHPのPHP文字列関数と正規表現のどちらがより効率的ですか?
#1でループすると、#2と比較して見た目が不格好なコードブロックになります(パターンをpreg_match()$whitelist_domains
に直接書き込むと、ワンライナーに凝縮できます)。
を扱うときに、単純な/よくある間違いが発生することがありますstrpos()
。これらの間違いには次のものが含まれます。
- 状態をチェックしていませ
false
んif
haystack
とneedle
を間違った順序で書く
#2には、経験の浅いコーダーの抑止力となる可能性のある正規表現(エスケープ、文字クラス、代替文字など)に関する知識が必要です。正規表現パターンの記述方法とホワイトリストに登録されるドメインの数によっては、#2は#1よりも維持が難しい可能性があります。
#2には、メタdomain.com
文字を介して単語の最後に部分文字列が表示されることを確認できるという追加の利点があります。$
このため、正規表現はより強力な検証を提供します。