2

在我的注册表单中,我要求用户输入与他们在上面的 url 字段中输入的域名相同的电子邮件。

现在,我以这种方式收集数据:

URL : http://www.domain.com domain.com 部分是用户输入的内容。http://www是硬编码的。

电子邮件:info@domain.com粗体部分由用户输入。@是硬编码的。

url 中的 domain.com 部分和电子邮件中的 domain.com 部分应该匹配。现在,我可以匹配这两个字段,因为它们是分开的。

但是我想放弃上面的做法,让用户输入整个域名和邮箱。在这种情况下,检查用户是否输入了与他在上面的 url 字段中输入的域相同的电子邮件是一种好方法。

我正在使用 php 完成所有这些工作。

4

6 回答 6

1

你可以这样做explode()

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

现在再次爆炸

$newpc= explode(".", $new );
$new1 = $newpc[0]; //which will be gmail
于 2012-11-18T07:29:39.777 回答
1
    <?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;
    }

所以这样做是:

首先,将电子邮件字符串拆分为数组中的两部分。第二部分是域。

其次,使用php内置函数解析url,然后提取“主机”,同时删除(可选)子域。

然后比较。

于 2012-11-18T07:30:27.100 回答
1

这是我的版本(经过测试,有效):

<?php
$domain = 'www2.example.com'; // Set domain here
$email = 'info@example.com';  // 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
}
?>
于 2012-11-18T09:17:40.387 回答
0

你可以这样做:

$parsedUrl = parse_url($yourEnteredUrl);
$domainHost = str_replace("www.", "", $parsedUrl["host"]);
$emailDomain = array_pop(explode('@', $yourEnteredEmail));
if( $emailDomain == $domainHost ) {
  //valid data
}
于 2012-11-18T07:38:00.907 回答
0

使用正则表达式和正则表达式(即仅返回我想要匹配的表达式,如果它前面有某个模式,但不要在匹配中包含后向本身),如下所示:

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

当然这有点过于简单了,因为您还需要考虑 https 或 www2 等,但这些只需要对 RegExp 进行微小的更改,使用问号作为“可选”运算符

于 2012-11-18T07:55:17.433 回答
0
$email = 'myemail@example.com';
$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);
于 2012-11-18T08:08:21.613 回答