2014-01-23 30 views
3

的Array我的域名,如數組:PHP - 電子郵件字符串中的域名

stonybrook.edu 
sunysuffolk.edu 
harvard.edu 

然後我有一個輸入字段,用戶輸入他或她的.edu的電子郵件地址。

例如:[email protected]

現在我想拒絕用戶註冊誰域數組中都沒有。因此,例如某人嘗試使用[email protected]註冊將被拒絕,因爲陣列中沒有「princeton.edu」。

我想創建一個'檢查',因爲我必須以某種方式將電子郵件地址匹配到域的數組。

我試着用in_array,但是我在做這個時遇到了麻煩。這是我到目前爲止:

<?php 

    $domains = array('stonybrook.edu', 'sunysuffolk.edu', 'harvard.edu'); 

    $myEmail = '[email protected]'; 

    if (in_array($myEmail, $domains)) { 

     echo 'You Are Allowed To Register!'; 

    } 

?> 

這失敗了。現在我想使用strpos(),但strpos()接受一個字符串參數,但我的域是一個數組。現在我的數組只有3個值,但最終該數組將變得非常大,因此使用循環不會太高效。

任何人都可以提供任何關於如何進行此驗證的建議嗎?謝謝!

編輯:

這裏是我設法得到它的工作:

<?php 

$domains = array('stonybrook.edu', 'sunysuffolk.edu', 'harvard.edu'); 

$count = 0; 

$myEmail = '[email protected]'; 

foreach ($domains as $domain) { 

    if (strpos($myEmail, $domain) !== false) $count++; 

} 

if ($count > 0) echo 'You Are Allowed To Register!'; 

?> 
+0

你只是看的社交網絡平臺,像我一樣? –

+0

@scrowler是的,我做過 –

+0

而不是像這樣繼續,只要做一個回聲,然後在你的條件下休息一下。 – zeflex

回答

3

做它:

$domains = array('stonybrook.edu', 'sunysuffolk.edu', 'harvard.edu'); 
$email = '[email protected]'; 

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    // Invalid email address 
    // .... 
    // Processing error 
    // Returng user to re-enter email 
}  

list($name,$domain) = explode('@',$email); // $domain=='mail.sunysuffolk.edu'; 
$domain = implode('.',array_slice(explode('.',$domain),-2,2)); // $domain=='sunysuffolk.edu'; 

if (in_array(strtolower($domain),$domains)){ 
print'You Are Allowed To Register!'; 
} 

Edit(對於@danronmoon & @Fred - ii-)

我添加了電子郵件驗證,但...思考,主要目標 - 顯示工作 解決方案的開始位置$domains = array('stonybrook.edu', 'sunysuffolk.edu', 'harvard.edu');$email = '[email protected]';。過濾,驗證和其他方面超出了當前的OP問題。

+0

這樣做效果很好,但是在評論中陳述的「danronmoon」,這會通過'sam \ @ mail.sunnyfolk.edu',我以前沒有測試過 - 所以我建議與['FILTER_VALIDATE_EMAIL'](http://php.net/manual/filter.filters.validate.php)一起使用。 –

+0

這只是一個建議。所有的更好的;-)我做了'+ 1'順便說一句。 –

+0

@Fred -ii-當然,不會更糟:) – voodoo417

0
<?php 

$domains = array('stonybrook.edu', 'sunysuffolk.edu', 'harvard.edu'); 

$myEmail = array(
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
); 

foreach ($myEmail AS $email) { 
    $domainExp = explode('@', $email); 
    $domainSplit = explode('.', $domainExp[1]); 
    foreach ($domains AS $domain) { 
     $count = count($domainSplit); 
     if ($domainSplit[$count - 2] . '.' . $domainSplit[$count -1] == $domain) { 
      echo $email . ' is allowed<br/>'; 
      break; 
     } 

    } 
} 
+2

'strtolower($ domain [1])''兼容性案例 –

+0

是的,但我沒有把所有需要的清潔代碼,如檢查@存在等等,等等...... – zeflex

+1

你修改了他的例子,使其工作。他期待以下電子郵件:'[email protected]'。您將其更改爲:'[email protected]' – jerry

2

這樣可以將域組件增量並檢查他們的$domains陣列中存在在每個迭代

$domains = array('stonybrook.edu', 'sunysuffolk.edu', 'harvard.edu'); 
$email = '[email protected]'; 

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    // not valid! 
    exit('Not a valid email'); 
} 

$email_domain = strtolower(explode('@', $email)[1]); 

$email_domain_parts = explode('.', $email_domain); 

$email_glue_arr = array(); 

$email_valid = false; 

while ($email_domain_part = array_pop($email_domain_parts)) { 
    array_unshift($email_glue_arr, $email_domain_part); 
    $email_domain_str_to_test = implode('.', $email_glue_arr); 


    if (in_array($email_domain_str_to_test, $domains)) { 
     $email_valid = true; 
     break; 
    } 
} 



if ($email_valid) { 
    // OK 
} 
+0

這一個工作相當好,除了這將通過'@ mmail.sunysuffolk.edu',就像'@ m.harvard.edu'一樣---目前爲止,只有'voodoo417's'答案效果最好。 –

+0

這就是整個觀點。 –

+0

@ Fred-ii-'現在我想拒絕不在域名'數組'中的用戶註冊似乎是問題的全部癥結 – danronmoon

相關問題