web-dev-qa-db-ja.com

PHP登録されているメールのドメインが「school.edu」アドレスであることを確認してください

楽しみのために取り組んでいるプロジェクトの関数を作成する必要があります。この関数では、教育機関の学生、スタッフ、卒業生だけがサイトにアクセスできるようにしています。

学校のウェブサイトがschool.eduだとしましょう。

送信されたメールアドレスのドメインが「school.edu」であることを確認するphpフィルターの作成に問題があります。

例を使用します。 Dude#1には[email protected]の電子メールがあり、Dude#2には[email protected]の電子メールがあります。 Dude 1にエラーメッセージが表示され、Dude#2の登録が成功したことを確認したいと思います。

それが私がやろうとしていることの要点です。近い将来、このサイトでは、school2.eduとschool3.eduの2つのロケールスクールによる登録が可能になります。次に、チェッカーが電子メールをドメインの小さなリスト(おそらく配列?)と照合して、電子メールがリストのドメイン名であることを確認する必要があります。

17
Phil

これを実現する方法はいくつかあります。次の1つです。

// Make sure we have input
// Remove extra white space if we do
$email = isset($_POST['email']) ? trim($_POST['email']) : null;

// List of allowed domains
$allowed = [
    'school.edu',
    'school2.edu',
    'school3.edu'
];

// Make sure the address is valid
if (filter_var($email, FILTER_VALIDATE_EMAIL))
{
    // Separate string by @ characters (there should be only one)
    $parts = explode('@', $email);

    // Remove and return the last part, which should be the domain
    $domain = array_pop($parts);

    // Check if the domain is in our list
    if ( ! in_array($domain, $allowed))
    {
        // Not allowed
    }
}
33
Wesley Murch

正規表現を使用できます:

if(preg_match('/^\w+@school\.edu$/i', $source_string) > 0)
    //valid

私が説明しなかったいくつかのクレイジーな電子メールアドレス機能があるので、コメントで私をバラバラにすることに進んでください:)

8
Brian Gordon

@の後にすべてを取得するだけでは、達成しようとしていることを達成できない場合があることに注意してください [email protected]のような電子メールアドレスのため。以下のget_domain関数は、ドメインをセカンドレベルドメインにのみ取得します。 [email protected]または[email protected]に対して「unc.edu」を返します。 また、国コード(2文字のトップレベルドメインを持つ)を持つドメインを考慮に入れることもできます。

以下の関数を使用して、ドメインを抽出できます。次に、学校のドメインの配列を使用するか、学校のドメインをデータベースに配置して、メールアドレスをそれと照合します。

    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";
    }
5
dougd_in_nc

私はこれをするだけです:

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

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

'whatever.edu'の部分は、常に_@_の後にあります。だから、あなたがする必要があるのは:

  1. 文字列内で最後に出現する_@_を見つけます。 (通常の電子メールでは、be 1つしかありませんが、ここでは問題ではありません。)
  2. _@_の後にメールの一部を取得します。これがドメイン名になります。
  3. in_array()を使用して、ドメイン名を_$acceptedDomains_で受け入れられているドメインのリストと比較します。

_[email protected]_からの電子メールも受け入れたい場合は、もう少し行う必要がありますが、ここでは適用できる場合とできない場合があります。また、これを行う前に、電子メールアドレスが適切に形成されていることを確認したことを前提としています。

3
Chris Hepner

シンプルで1行:

     list($name, $domain) = explode('@', $email);
2
Sampath Perera

Laravelを使用している場合:

Str::endsWith($email, '@foo.bar.edu'); // bool
0
hinteractive02

あなたはいつでもこのようなことをすることができます:

$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]+)/", $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!
}
0
Patrick Perini