Norman
Norman

Reputation: 6365

Check if a user entered an email address that has a domain similar to the domain name they enter above

In my signup form, I ask users to enter an email with the same domain name as they enter in the url field above.

Right now, I collect data this way:

URL : http://www.domain.com The domain.com part is what the user enters. The http://www is hard coded.

Email : info@ domain.com The bold part is entered by the user. The @ is hard coded.

The domain.com part in the url and domain.com part in the email should match. Right now, I can match the two fields since they are separate.

But I want to give up the above approach and make the user enter the entire domain name and email. When that's the case, what would be a good way to check if a user entered an email with the same domain he entered in the url field above.

I'm doing all this using php.

Upvotes: 2

Views: 407

Answers (6)

uınbɐɥs
uınbɐɥs

Reputation: 7351

This is my version (tested, works):

<?php
$domain = 'www2.example.com'; // Set domain here
$email = '[email protected]';  // Set email here

if(!preg_match('~^https?://.*$~i', $domain)) { // Does the URL start with http?
    $domain = "http://$domain"; // No, prepend it with http://
}
if(filter_var($domain, FILTER_VALIDATE_URL)) { // Validate URL
    $host = parse_url($domain, PHP_URL_HOST); // Parse the host, if it is an URL
    if(substr_count($host, '.') > 1) { // Is there a subdomain?
        $host = substr($host, -strrpos(strrev($host), '.')); // Get the host
    }
    if(strpos(strrev($email), strrev($host)) === 0) { // Does it match the end of the email?
        echo 'Valid!'; // Valid
    } else {
        echo 'Does not match.'; // Invalid
    }
} else {
    echo 'Invalid domain!'; // Domain is invalid
}
?>

Upvotes: 1

Matanya
Matanya

Reputation: 6346

Use regular expressions with positive lookbehinds(i.e only return the expression I'd like to match if it is preceded by a certain pattern, but don't include the lookbehind itself in the match), like so:

<?php 
$url = preg_match("/(?<=http:\/\/www\.).*/",$_POST['url'],$url_match);
$email = preg_match("/(?<=@).*/",$_POST['email'],$email_match);
if ($url_match[0]==$email_match[0]) {
  // Success Code
 }   
else {
 // Failure Code
     }
?>

Of course this is a bit oversimplified as you also need to account for https or www2 and the likes, but these require only minor changes to the RegExp, using the question mark as the "optional" operator

Upvotes: 0

Jean
Jean

Reputation: 772

    <?php

    //extract domain from email
    $email_domain_temp = explode("@", $_POST['email']);
    $email_domain = $email_domain_temp[1];

    //extract domain from url
    $url_domain_temp = parse_url($_POST['url']);
    $url_domain = strip_out_subdomain($url_domain_temp['host']);

    //compare
    if ($email_domain == $url_domain){
        //match
    }

    function strip_out_subdomain($domain){
        //do nothing if only 1 dot in $domain
        if (substr_count($domain, ".") == 1){
             return $domain;
        }
        $only_my_domain = preg_replace("/^(.*?)\.(.*)$/","$2",$domain);
        return $only_my_domain;
    }

So what this does is :

First, split the email string in 2 parts in an array. The second part is the domain.

Second, use the php built in function to parse the url, then extract the "host", while removing the (optionnal) subdomain.

Then compare.

Upvotes: 1

nkamm
nkamm

Reputation: 627

$email = '[email protected]';
$site  = 'http://example.com';

$emailDomain = ltrim( strstr($email, '@'), '@' );

// or automate it using array_map(). Syntax is correct only for >= PHP5.4
$cases = ['http://'.$emailDomain, 'https://'.$emailDomain, 'http://www.'.$emailDomain, 'https://www.'.$emailDomain];

$bSameDomain = in_array($site, $cases);
var_dump($bSameDomain);

Upvotes: 0

Sudhir Bastakoti
Sudhir Bastakoti

Reputation: 100175

you could do:

$parsedUrl = parse_url($yourEnteredUrl);
$domainHost = str_replace("www.", "", $parsedUrl["host"]);
$emailDomain = array_pop(explode('@', $yourEnteredEmail));
if( $emailDomain == $domainHost ) {
  //valid data
}

Upvotes: 0

NullPoiиteя
NullPoiиteя

Reputation: 57322

you can do this by explode()

supp url = [email protected]
$pieces = explode("@", $url);
$new = $pieces[1]; //which will be gmail.com

now again explode

$newpc= explode(".", $new );
$new1 = $newpc[0]; //which will be gmail

Upvotes: 1

Related Questions