Bagaimana cara memvalidasi Email di PHP?


120

Bagaimana saya bisa memvalidasi nilai input adalah alamat email yang valid menggunakan php5. Sekarang saya menggunakan kode ini

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

tetapi itu menunjukkan kesalahan yang tidak berlaku lagi. Bagaimana saya bisa memperbaiki masalah ini. Tolong bantu aku.


3
Jawaban yang benar telah diberikan, tetapi terkait masalah yang tidak digunakan lagi : Penggunaan ekspresi reguler POSIX (yang eregimerupakan fungsi dari) tidak digunakan lagi. Gunakan PCRE sebagai gantinya.
— Felix Kling

3
Omong-omong, ekspresi reguler Anda salah total. Beberapa alamat yang benar-benar valid akan ditandai tidak valid oleh fungsi Anda. Memfilter alamat email dengan regex adalah mimpi buruk.
— Artefak2

Anda harus menggunakan standar RFC 822 dan berikut adalah artikel bagus Parsing Alamat Email di PHP yang menjelaskannya.
— kta

Jawaban:


275

Anda dapat menggunakan filter_var()fungsi tersebut, yang memberi Anda banyak opsi validasi dan sanitasi yang praktis.

filter_var($email, FILTER_VALIDATE_EMAIL)

Jika Anda tidak ingin mengubah kode yang mengandalkan fungsi Anda, lakukan saja:

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

Catatan : Untuk penggunaan lain (di mana Anda memerlukan Regex), eregkeluarga fungsi yang tidak digunakan lagi (Fungsi Regex POSIX) harus diganti dengan pregkeluarga ( Fungsi Regex PCRE ). Ada sedikit perbedaan, membaca Manual sudah cukup.

Pembaruan 1 : Seperti yang ditunjukkan oleh @binaryLV :

PHP 5.3.3 dan 5.2.14 memiliki bug yang terkait dengan FILTER_VALIDATE_EMAIL, yang mengakibatkan segfault saat memvalidasi nilai besar. Solusi sederhana dan aman untuk ini digunakan strlen() sebelumnya filter_var(). Saya tidak yakin tentang 5.3.4 final, tetapi ada tertulis bahwa beberapa versi snapshot 5.3.4 juga terpengaruh.

Bug ini telah diperbaiki.

Pembaruan 2 : Metode ini tentu saja akan divalidasi bazmega@kapasebagai alamat email yang valid, karena sebenarnya itu adalah alamat email yang valid. Tetapi sebagian besar waktu di Internet, Anda juga ingin alamat email untuk memiliki TLD: bazmega@kapa.com. Seperti yang disarankan dalam posting blog ini (tautan diposting oleh @Istiaque Ahmed ), Anda dapat menambahkan filter_var()dengan regex yang akan memeriksa keberadaan titik di bagian domain (meskipun tidak akan memeriksa TLD yang valid ):

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

Seperti yang ditunjukkan oleh @Eliseo Ocampos , masalah ini hanya ada sebelum PHP 5.3, di versi itu mereka mengubah regex dan sekarang melakukan pemeriksaan ini, jadi Anda tidak perlu melakukannya.


4
+1 Meskipun demikian, Anda mungkin ingin menyebutkan bahwa ini hanya tersedia di PHP 5.2.x dan yang lebih baru. :-)
— John Parker

5
@middaparka: Karena OP mendapatkan pesan yang tidak digunakan lagi eregi, sepertinya dia menggunakan PHP 5.3. Tapi ya, penting untuk menyebutkannya (untuk orang lain)).
— Felix Kling

8
PHP 5.3.3 dan 5.2.14 memiliki bug ( bugs.php.net/52929 ) yang terkait FILTER_VALIDATE_EMAIL, yang mengakibatkan segfault saat memvalidasi nilai besar. Solusi sederhana dan aman untuk ini digunakan strlen()sebelumnya filter_val(). Saya tidak yakin tentang 5.3.4 final, tetapi ada tertulis bahwa beberapa versi snapshot 5.3.4 juga terpengaruh.
— binaryLV

1
@binaryLV, filter_valatau filter_var?
— Istiaque Ahmed

3
@kapa, Sebenarnya Anda tidak perlu lagi memeriksa titik di bagian domain. Lihat svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/filter/…
— Eliseo Ocampos


7

Ini adalah posting lama tetapi saya akan membagikan satu solusi saya karena tidak ada yang menyebutkan di sini satu masalah sebelumnya.

Alamat email baru dapat berisi karakter UTF-8 atau nama domain khusus seperti .live, .newsdll.

Saya juga menemukan bahwa beberapa alamat email bisa di Cyrilic dan pada semua kasus standar regex atau filter_var()akan gagal.

Itu sebabnya saya membuat solusi untuk itu:

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

Fungsi ini berfungsi dengan sempurna untuk semua kasus dan format email.


3

Saya selalu menggunakan ini:

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 Saya telah mencoba kode Anda dan menemukan bahwa jika Anda melewatkan email alex@.maka selalu mengembalikan true di mana itu bukan alamat email yang valid.
— Subhajit



0

Data pengguna sangat penting bagi pengembang yang baik, jadi jangan bertanya lagi dan lagi untuk data yang sama, gunakan logika untuk memperbaiki beberapa kesalahan dasar dalam data.

Sebelum validasi Email: Pertama, Anda harus menghapus semua karakter ilegal dari email.

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

setelah itu validasi alamat email Anda menggunakan filter_var()fungsi ini .

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

Misalnya

<?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";
}
?>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.