我正在尝试从文件中读取所有行,而不是查看给定字符串是否包含任何这些行。
我的代码
$mails = file('blacklist.txt');
$email = "hendrik@anonbox.net";
$fail = false;
foreach($mails as $mail) {
if(strpos($email, $mail) > 0) {
$fail = true;
}
}
if($fail) {
echo "Fail";
} else {
echo "you can use that";
}
blacklist.txt
可以在http://pastebin.com/aJyVkcNx找到。
我希望strpos
返回黑名单中至少一个字符串的位置,但事实并非如此。我猜不知道我在$mails
内并没有像我期待的那样产生那种价值。
编辑此内容为print_r($mails)
http://pastebin.com/83ZqVwHx
EDIT2澄清:我想查看某个域是否在电子邮件中,即使该邮件包含subdomain.domain.tld
。我尝试使用!== false
而不是> 0
来产生相同的结果。
答案 0 :(得分:1)
strpos
会返回FALSE
。
只需使用:
$fail = false;
foreach($mails as $mail) {
if(strpos($email, $mail) === false) {
$fail = true;
}
}
或者更好地使用它:
$blacklist = file_get_contents('blacklist.txt');
$email = "hendrik@anonbox.net";
if(strpos($email, $blacklist) === false){
echo "fail";
} else {
echo "This email is not blacklisted";
}
答案 1 :(得分:1)
虽然您仍然可以使用foreach
,但array reduce
模式:
function check_against($carry, $mail, $blacklisted) {
return $carry ||= strpos($mail, $blacklisted) !== false;
};
var_dump(array_reduce($mails, "check_against", $email_to_check));
希望它有所帮助。
答案 2 :(得分:1)
你已经找到了strpos功能的常见缺陷。 strpos函数的返回值是指它找到字符串的位置。在这种情况下,如果字符串从第一个字符开始,它将返回0. 注意0!== false 。
使用该功能的正确方法是:
if(strpos($email, $mail) !== false){
// the string was found, potentially at position 0
}
但是,这个功能可能根本不需要;如果您只是检查$mail
是否与$email
相同,而不是查看字符串是否存在于更大的字符串中,那么只需使用:
if($mail == $email){
// they are the same
}
答案 3 :(得分:1)
您需要仔细解析电子邮件,因为您正在检查电子邮件地址的域名(如果它在黑名单中)。例如:
$email = "hendrik@foo.anonbox.net";
if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
preg_match('/@.*?([^.]+[.]\w{3}|[^.])$/', $email, $matches);
if(!empty($matches) && isset($matches[1])) {
$domain = $matches[1];
} else {
// not good email
exit;
}
// THIS IS FOR SAMPLES SAKE, i know youre using file()
$blacklist = explode("\n", file_get_contents('http://pastebin.com/raw.php?i=aJyVkcNx'));
foreach($blacklist as $email) {
if(stripos($email, $domain) !== false) {
echo 'you are blacklisted';
exit;
}
}
}
// his/her email is ok continue
答案 4 :(得分:0)
另一种解决方法。工作正常:
$blacklist = file_get_contents('blacklist.txt');
$email = "hendrik@x.ip6.li";
$domain = substr(trim($email), strpos($email, '@')+1);
if(strpos($blacklist, $domain)){
echo "Your email has been blacklisted!";
}else{
echo "You are all good to go! not blacklisted :-)";
}
古德勒克!