2

我有一个 .txt 文件,我想在其中找到与表单中输入的单个电子邮件完全匹配的内容。

我使用的当前指令(见下文)适用于标准形式。但是当我将它与 AJAX 调用和 jQuery 结合使用时,它会通过查找第一次出现来确认它的存在。

例如:

如果该人输入“bobby@”,则表示未找到,很好。

如果有人输入他们的完整电子邮件地址并且它存在于文件中,它会显示“找到”,非常好。

现在,如果有人只输入“bobby”,它会说“找到”,不好。

我在下面使用了以下三个示例,结果相同。

if ( !preg_match("/\b{$email}\b/i", $emails )) {

echo "Sorry, not found";

}

和...

if ( !preg_match( "/(?:^|\W){$email}(?:\W|$)/", $emails )) {

echo "Sorry, not found";

}

和...

if ( !preg_match('/^'.$email.'$/', $emails )) {

echo "Sorry, not found";

}

我的 AJAX

$.ajax({  
type: "POST",  
url: "email_if_exist.php",  
data: "email="+ usr,
success: function(msg){

我的文本文件

Bobby Brown bobby@somewhere.com
Guy Slim guy@somewhere.com
Slim Jim slim@somewhere.com

我曾想过使用 jQuery 函数只接受完整的电子邮件地址,但没有成功,部分原因是我不知道将它放在脚本中的哪个位置。

我花了很多时间寻找解决方案,现在我正在寻求一些帮助。

干杯。

4

6 回答 6

1

因为您的文本文件中包含“bobby”,所以您建议的任何正则表达式都将始终找到“bobby”。我建议在运行正则表达式之前检查 @ 符号的存在,因为任何有效的电子邮件都将始终包含 @。尝试这样的事情:

if (strpos($email,'@')) {
    if ( !preg_match("/\b{$email}\b/i", $emails )) {
        echo "Sorry, not found";
    }
}

编辑: 4年后看这个......我会让正则表达式匹配到行尾,使用m修饰符指定多行以便$匹配换行符或EOF。PHP 行将是:

if ( !preg_match("/\b{$email}$/im", $emails )) {
于 2013-02-27T20:16:11.730 回答
0

如果您只是检查用户是否存在,这应该可以:

$users = trim(preg_replace('/\s\s+/', ' ', $users));
$userArray = explode(' ', $users);
$exists = in_array($email, $userArray);

在哪里$users引用示例文件并$email引用查询的电子邮件。

这会将所有换行符(和双空格)替换为空格,然后按空格拆分为一个数组,然后,如果该电子邮件存在于该数组中,则该用户存在。

希望我有所帮助!

于 2017-11-18T18:22:00.093 回答
0

如果您的文本文件中的每一行都以电子邮件结尾,

因此您可以通过“电子邮件+结束行”进行正则表达式测试和匹配

像那样:

if( preg_match("/.+{$email}[\n|\r\n|\r]/", $textFileEmails) ) 
{
     /// code
}
于 2017-11-21T10:53:55.530 回答
0

如果您的文件被格式化为您的示例first_name, last_name, email@address.tdl ,那么在加载搜索时很容易将其分解。

preg_match如果建议您preg使用它来验证电子邮件地址,我不知道您为什么要使用它。您最好使用indexOfphp ( strpos) 中的方法来搜索文件,但以下方法适用于您的固定文件格式。

面向对象的文件阅读器和搜索器

class Search{
    private $users = array();
    public function __construct($password_file){
        $file = file_get_contents($password_file);
        $lines = explode("\n", $file);
        $users = array();
        foreach($lines as $line){
            $users = expode(" ", $line);
        }
        foreach($users as $user){
            $this->users[] = array("first_name" => $user[0], "last_name" => $user[1], "email" => $user[2])
        }
    }

    public function searchByEmail($email){
        foreach($this->users as $key => $user){
            if($user['email'] == $email){
                    // return user array
                    return $user;
                    // or you could return user id
                    //return $key;
            }
        }
        return false;
    }
}

然后使用

$search = new Search($passwdFile);
$user = $search->searchByEmail($_POST['email']);
echo ($user)? "found":"Sorry, not found";

用于preg_match验证电子邮件然后检查

如果你想使用 preg 和你自己的文件搜索系统。

function validateEmail($email) {
    $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";

    return (bool)preg_match($v, $email);
}

然后像

if(validateEmail($_POST['email'])){
    echo (strpos($_POST['email'], $emails) !== false)? "found":"Sorry, not found";
}
于 2017-11-18T13:15:33.733 回答
0

该代码将首先使用 php 核心函数验证电子邮件是否正确,然后检查是否出现

$email = 'bobby@somewhere.com';
$found = false;
//PHP has a built-in function to validate an email 
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
    //Grab lines from the file
    $lines = file('myfile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    foreach ($lines as $line) {
        //Grab words from the line
        $words = explode(" ", $line);
        //If email found within the words set the flag as true.
        if(in_array($email, $words)) {
            $found = true;
            //If the aim is only to find the email, we can break out here.
            break;
        }
    }
}
if(false === $found) {
    echo 'Not found!';
} else {
    echo 'Found you!';
}
于 2017-11-21T23:39:54.193 回答
0

'/^'.$email.'$/' 非常接近。由于您希望仅当完整的电子邮件地址在文件中时检查为“真”,所以您应该在模式中包含电子邮件的“限制”: 之前的空格和之后的 end_of_the_line 如果:

'/ '.$email.'$/'

(是的,我刚刚将 ^ -start of line- 更改为空格)

于 2017-11-21T07:42:43.573 回答