Funk Forty Niner
Funk Forty Niner

Reputation: 74219

Finding an exact match in a text file using PHP AJAX jQuery form

I have a .txt file where I would like to find an EXACT match of a single email entered in a form.

The present directives (see below) I used, work for a standard form. But when I use it in conjunction with an AJAX call and jQuery, it confirms it exists by just finding the first occurrence.

For example:

If that person enters "bobby@" it says not found, good.

If someone enters their full Email address and it exists in the file, it says "found", very good.

Now, if someone enters just "bobby", it says "found", not good.

I used the following three examples below with the same results.

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

echo "Sorry, not found";

}

and...

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

echo "Sorry, not found";

}

and...

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

echo "Sorry, not found";

}

my AJAX

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

my text file

Bobby Brown [email protected]
Guy Slim [email protected]
Slim Jim [email protected]

I thought of using a jQuery function to only accept a full email address, but with no success partly because I didn't know where to put it in the script.

I've spent a lot of time in searching for a solution to this and I am now asking for some help.

Cheers.

Upvotes: 2

Views: 1178

Answers (6)

Barkermn01
Barkermn01

Reputation: 6842

If you file is formatted as your example first_name, last_name, [email protected] it's really easy to break it up on load to search.

I don't know why you would use preg_match for this bit your if you were advised to use preg use it to verify the email address. You're better off using indexOf method in php (strpos) to search the file but the below method works for your fixed file format.

Object Orientated File Reader and searcher

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;
    }
}

Then to use

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

Using preg_match to validate email then check

If you want to use preg and your own file search system.

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

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

then use like

if(validateEmail($_POST['email'])){
    echo (strpos($_POST['email'], $emails) !== false)? "found":"Sorry, not found";
}

Upvotes: 0

Quentin Skousen
Quentin Skousen

Reputation: 1055

Because your text file contains "bobby" in it, any regex such as you are suggesting will always find "bobby". I would suggest checking for the presence of the @ symbol BEFORE you run the regex, as any valid email will always have @ in it. Try something like this:

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

EDIT: Looking at this 4 years later... I would make the regex match to the end of the line, using the m modifier to specify multiline so the $ matches newline or EOF. The PHP line would be:

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

Upvotes: 1

Kamal Soni
Kamal Soni

Reputation: 1552

The code would validate first using php core functions whether the email is correct or not and then check for the occurrence.

$email = '[email protected]';
$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!';
}

Upvotes: 0

shushu304
shushu304

Reputation: 1498

If your text file filled with lines that every line ending with the email,

so you can regex with testing and match by your "email + end od line"

like that:

if( preg_match("/.+{$email}[\n|\r\n|\r]/", $textFileEmails) ) 
{
     /// code
}

Upvotes: 0

miguel-svq
miguel-svq

Reputation: 2176

'/^'.$email.'$/' is quite close. Since you want the check being "true" only if the full email address is on the file you should include in the pattern the "limits" of the email: Whitespace before and end_of_the_line after if:

'/ '.$email.'$/'

(Yes, I've just changed ^ -start of line- for a whitespace)

Upvotes: 0

Cole
Cole

Reputation: 441

If you're just checking to see if the user exists, this should work:

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

Where $users is referencing to the example file and $email is referencing to the queried e-mail.

This replaces all newlines (and double spaces) with spaces and then splits by spaces into an array, then, if the e-mail exists in the array, the user exists.

Hope I helped!

Upvotes: 0

Related Questions