PHP从文件中读取行并进行比较

时间:2014-07-25 07:57:24

标签: php file strpos

我正在尝试从文件中读取所有行,而不是查看给定字符串是否包含任何这些行。

我的代码

$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来产生相同的结果。

5 个答案:

答案 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 :-)";
}

古德勒克!