PHPでメールを検証する方法は?


120

php5を使用して、入力値が有効なメールアドレスであることを確認するにはどうすればよいですか。今、私はこのコードを使用しています

function isValidEmail($email){ 
     $pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"; 

     if (eregi($pattern, $email)){ 
        return true; 
     } 
     else { 
        return false; 
     }    
} 

ただし、非推奨のエラーが表示されます。この問題を解決するにはどうすればよいですか。私を助けてください。


3
正しい答えはすでに与えられていますが、非推奨の問題に関して:(eregi関数である)POSIX正規表現の使用は非推奨です。代わりにPCREを使用してください。
Felix Kling、

3
ところで、あなたの正規表現は完全に間違っています。一部の完全に有効なアドレスは、関数によって無効としてマークされます。正規表現でメールアドレスをフィルタリングすることは悪夢です。
Artefact2

RFC 822標準を使用する必要があります。ここでは、PHPでの電子メールアドレスの解析について説明しています。
kta 2014年

回答:


274

このfilter_var()関数を使用すると、便利な検証とサニタイズのオプションがたくさん提供されます。

filter_var($email, FILTER_VALIDATE_EMAIL)

関数に依存するコードを変更したくない場合は、次のようにします。

function isValidEmail($email){ 
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

:その他の用途(Regexが必要な場合)では、非推奨のereg関数ファミリー(POSIX Regex関数)をpregファミリー(PCRE Regex関数)に置き換える必要があります。多少の違いはありますが、マニュアルを読むだけで十分です。

更新1@binaryLVによって指摘されたように

PHP 5.3.3と5.2.14にはFILTER_VALIDATE_EMAILに関連するバグがあり、大きな値を検証するときにsegfaultが発生しました。これに対するシンプルで安全な回避策は、strlen() before を使用することfilter_var()です。最終的な5.3.4についてはわかりませんが、一部の5.3.4-snapshotバージョンも影響を受けたと書かれています。

このバグはすでに修正されています。

更新2:もちろん、このメソッドはbazmega@kapa実際には有効なメールアドレスであるため、有効なメールアドレスとして検証されます。しかし、ほとんどの場合、インターネットでは、電子メールアドレスにTLDが必要ですbazmega@kapa.com。このブログ投稿@Istiaque Ahmedによって投稿されたリンク)で提案されてfilter_var()いるように、ドメイン部分にドットの存在をチェックする正規表現を追加できます(ただし、有効な TLD はチェックされません)。

function isValidEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) 
        && preg_match('/@.+\./', $email);
}

以下のよう@Eliseo Ocamposが指摘し、この問題は、PHP 5.3の前に存在しているバージョンで、彼らは正規表現を変更し、あなたがする必要はありませんので、今では、このチェックを行います。


4
+1とはいえ、これはPHP 5.2.x以降でのみ利用可能であることを言及したいかもしれません。:-)
ジョンパーカー、

5
@middaparka:OPが非推奨のメッセージを受け取るeregiと、彼はPHP 5.3を使用しているようです。しかし、はい、それを(他の人のために)言及することが重要です。
Felix Kling、

8
PHP 5.3.3と5.2.14にはに関連するバグ(bugs.php.net/52929)がありFILTER_VALIDATE_EMAIL、大きな値を検証するときにsegfaultが発生しました。これに対するシンプルで安全な回避策は、strlen()before を使用することfilter_val()です。最終的な5.3.4についてはわかりませんが、一部の5.3.4-snapshotバージョンも影響を受けたと書かれています。
binaryLV

1
@binaryLV、filter_valまたはfilter_var
Istiaque Ahmed 2012

3
@kapa、実際にはドメイン部分のドットをチェックする必要はもうありません。svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/filter/…を
Eliseo Ocampos

9

http://www.php.net/manual/en/function.ereg.phpにあるメモを参照してください

Note:

PHP 5.3.0以降では、正規表現拡張は非推奨になり、PCRE拡張が優先されます。この関数を呼び出すと、E_DEPRECATED通知が発行されます。 PCREへの変換については、相違点のリストを参照してください。

Note:

Perl互換の正規表現構文を使用するpreg_match()は、多くの場合ereg()より高速な代替手段です。


7

これは古い投稿ですが、ここでは1つの問題について誰も言及していないので、私の解決策の1つを共有します。

新しいメールアドレスには、UTF-8文字や.live.newsなどの特殊なドメイン名を含めることができます。

また、一部の電子メールアドレスがCyrilicおよびすべてのケースで標準の正規表現であるか、filter_var()失敗する可能性があることもわかりました。

それが私がそれのための解決策を作った理由です:

function valid_email($email) 
{
    if(is_array($email) || is_numeric($email) || is_bool($email) || is_float($email) || is_file($email) || is_dir($email) || is_int($email))
        return false;
    else
    {
        $email=trim(strtolower($email));
        if(filter_var($email, FILTER_VALIDATE_EMAIL)!==false) return $email;
        else
        {
            $pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';
            return (preg_match($pattern, $email) === 1) ? $email : false;
        }
    }
}

この機能は、すべてのケースと電子メール形式で完全に機能します。


3

私はいつもこれを使います:

function validEmail($email){
    // First, we check that there's one @ symbol, and that the lengths are right
    if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {
        // Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
        return false;
    }
    // Split it into sections to make life easier
    $email_array = explode("@", $email);
    $local_array = explode(".", $email_array[0]);
    for ($i = 0; $i < sizeof($local_array); $i++) {
        if (!preg_match("/^(([A-Za-z0-9!#$%&'*+\/=?^_`{|}~-][A-Za-z0-9!#$%&'*+\/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$/", $local_array[$i])) {
            return false;
        }
    }
    if (!preg_match("/^\[?[0-9\.]+\]?$/", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
        $domain_array = explode(".", $email_array[1]);
        if (sizeof($domain_array) < 2) {
            return false; // Not enough parts to domain
        }
        for ($i = 0; $i < sizeof($domain_array); $i++) {
            if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) {
                return false;
            }
        }
    }

    return true;
}

1
@unbreak私はあなたのコードを試しましたが、あなたが電子メールを渡すalex@.場合、それが有効な電子メールアドレスではない場合は常にtrueを返します。
Subhajit



0

ユーザーデータは優れた開発者にとって非常に重要です。同じデータを何度も求めないでください。ロジックを使用してデータの基本的なエラーを修正してください。

電子メールの検証前:最初に、電子メールからすべての不正な文字を削除する必要があります。

//This will Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

その後、このfilter_var()関数を使用してメールアドレスを検証します。

filter_var($email, FILTER_VALIDATE_EMAIL)) // To Validate the email

例えば

<?php
$email = "john.doe@example.com";

// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

// Validate email
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo $email." is a valid email address";
} else {
    echo $email." is not a valid email address";
}
?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.