以下是两种具有不同优点的直接/常用方法:
方法#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 中的正则表达式哪个更高效?
与#2 相比,#1 中的循环使得代码块看起来更笨重(如果您将模式直接写入preg_match()$whitelist_domains
,则可以将其压缩为单行)。
处理strpos()
. 这些错误可能包括:
false
不检查if
条件
- 以错误的顺序书写
haystack
andneedle
#2 确实需要一些关于正则表达式(转义、字符类、替代项等)的知识,这对于没有经验的编码人员来说可能是一种威慑。根据您编写正则表达式模式的方式以及将有多少域列入白名单,#2 可能比 #1 更难维护。
#2 的额外好处是能够domain.com
通过元字符检查子字符串是否出现在单词的末尾$
。因此,正则表达式提供了更强的验证。