2011-08-02 19 views
15

Tôi cần viết chức năng cho dự án tôi đang làm việc để giải trí, nơi chúng tôi chỉ làm cho trang web có thể truy cập được đối với sinh viên, nhân viên và cựu sinh viên tại một cơ sở giáo dục.Kiểm tra PHP miền email được đăng ký là địa chỉ 'school.edu'

Giả sử trang web của trường là: school.edu.

Tôi đang gặp rắc rối bằng văn bản một bộ lọc php để kiểm tra rằng địa chỉ email gửi có lĩnh vực "school.edu"

tôi sẽ sử dụng một ví dụ. Dude # 1 có email [email protected] và Dude # 2 có email tại [email protected] Tôi muốn đảm bảo rằng Dude 1 nhận được thông báo lỗi và Dude # 2 có đăng ký thành công.

Đó chính là ý chính của những gì tôi đang cố gắng làm. Trong tương lai gần, trang web sẽ cho phép đăng ký bởi hai trường địa phương khác: school2.edu và school3.edu. Sau đó, tôi sẽ cần người kiểm tra để kiểm tra email chống lại một danh sách nhỏ (có thể là một mảng?) Của các miền để xác minh rằng email là một tên miền trong danh sách.

+1

Và những gì bạn đã đưa ra? Bạn đã bắt đầu viết bất cứ điều gì, hoặc nghiên cứu [biểu thức chính quy của php] (http://php.net/manual/en/book.regex.php), chẳng hạn? Ngoài ra những gì về đăng ký học tập từ các nước khác, chẳng hạn như Vương quốc Anh (với '.ac.uk' tld)? –

+0

[email protected] - anh ấy có thể có một số gợi ý cho bạn ... hoặc có thể bạn có thể nhận được một trong những winklevi, họ có một số kinh nghiệm ở đây. –

+0

Ngay bây giờ nó chỉ dành cho một số trường học địa phương. Chúng tôi gần như đã thực hiện mã hóa toàn bộ trang web. Chỉ cần thêm một số tính năng cuối cùng, chẳng hạn như tập lệnh xác thực email. – Phil

Trả lời

30

Có chắc chắn một số cách để kiểm tra, đây là những gì tôi đã đưa ra khỏi đỉnh đầu của tôi:

$email = $_POST['email']; 
$allowed = array('school.edu', 'school2.edu', 'school3.edu'); 

// Make sure the address is valid 
if (filter_var($email, FILTER_VALIDATE_EMAIL)) 
{ 
    $explodedEmail = explode('@', $email); 
    $domain = array_pop($explodedEmail); 

    if (! in_array($domain, $allowed)) 
    { 
     // Not allowed 
    } 

} 

explode() tách chuỗi bởi @ ký tự (không nên có chỉ có một anyways, vì vậy có thể một số substr() sẽ hiệu quả hơn một chút) và array_pop() xóa và trả về giá trị cuối cùng, tất cả mọi thứ sau @ và là miền của email.

Có thể có phương pháp hay hơn hoặc ngắn gọn hơn, nhưng điều này sẽ hoạt động bất kể.

+1

Giống như một gợi ý bổ sung, và điều này có thể cho tất cả các đầu vào văn bản, hãy nhớ chạy trim() trên các giá trị đã gửi của bạn, trong trường hợp ai đó thêm một khoảng trống vào cuối địa chỉ email – thorne51

4

Bạn có thể sử dụng regex:

if(preg_match('/^\[email protected]\.edu$/i', $source_string) > 0) 
    //valid 

Bây giờ tiến hành xé tôi ngoài trong các ý kiến ​​bởi vì có một số tính năng địa chỉ email điên Tôi không chiếm :)

1

Bạn luôn có thể làm điều gì đó như này:

$good_domains = array('school.edu'); //in the future, just add to this array for more schools 

$email = "[email protected]"; //your user's email 

$matches = array(); 
preg_match("/^(.+)@([^\(\);:,<>]+\.[a-zA-Z]{2,4})/", $email, &$matches); //validates the email and gathers information about it simultaneously 
//should return ['[email protected]', 'user', 'mail.com'] 
$domain = $matches[3]; 

if(in_array($domain, $goood_domains)) 
{ 
    //success! your user is from school.edu! 
} 
else 
{ 
    //oh no! an imposter! 
} 
3

tôi chỉ muốn làm điều này:

$acceptedDomains = array('site1.edu', 'site2.edu'); 

if(in_array(substr($email, strrpos($email, '@') + 1), $acceptedDomains)) 
{ 
    // Email is from a domain in $acceptedDomains 
} 

Phần 'whatever.edu' sẽ luôn sau @. Vì vậy, tất cả những gì bạn cần làm là:

  1. Tìm sự xuất hiện cuối cùng của @ trong chuỗi. (Trong một email thông thường, sẽ chỉ có một, nhưng điều đó không quan trọng ở đây.)
  2. Lấy một phần của email sau @. Đây sẽ là tên miền.
  3. Sử dụng in_array() để so sánh tên miền với danh sách các miền được chấp nhận trong $acceptedDomains.

Lưu ý rằng nếu bạn cũng muốn chấp nhận email từ [email protected], bạn phải làm thêm một chút, nhưng điều đó có thể hoặc không thể áp dụng tại đây. Tôi cũng giả định rằng bạn đã xác thực rằng các địa chỉ email được tạo tốt trước khi thực hiện việc này.

5

Lưu ý rằng chỉ nhận được mọi thứ sau @ có thể không thực hiện được những gì bạn đang cố gắng hoàn thành vì địa chỉ email như [email protected] Hàm get_domain bên dưới sẽ chỉ nhận miền xuống miền cấp thứ hai. Nó sẽ trả về "unc.edu" cho [email protected] hoặc [email protected] Ngoài ra, bạn có thể muốn tính toán các tên miền có mã quốc gia (có các tên miền cấp cao nhất là 2 ký tự).

Bạn có thể sử dụng chức năng bên dưới để trích xuất miền. Sau đó, bạn có thể sử dụng một loạt các lĩnh vực trường học, hoặc đặt các lĩnh vực trường học trong một cơ sở dữ liệu và kiểm tra địa chỉ email chống lại điều đó.

function get_domain($email) 
    { 
     if (strrpos($email, '.') == strlen($email) - 3) 
      $num_parts = 3; 
     else 
      $num_parts = 2; 

     $domain = implode('.', 
      array_slice(preg_split("/(\.|@)/", $email), - $num_parts) 
     ); 

     return strtolower($domain); 
    } 


    // test the function 
    $school_domains = array('unc.edu', 'ecu.edu'); 

    $email = '[email protected]'; 

    if (in_array(get_domain($email), $school_domains)) 
    { 
     echo "good"; 
    } 
3

Đơn giản và dòng đơn:

 list($name, $domain) = explode('@', $email); 
Các vấn đề liên quan