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.

pelajar
sumber
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: [email protected]. 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.

kapa
sumber
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
9

Lihat catatan di http://www.php.net/manual/en/function.ereg.php :

Note:

Mulai dari PHP 5.3.0, ekstensi regex sudah tidak digunakan lagi karena mendukung ekstensi PCRE . Memanggil fungsi ini akan mengeluarkan pemberitahuan E_DEPRECATED. Lihat daftar perbedaan untuk bantuan dalam mengonversi ke PCRE.

Note:

preg_match () , yang menggunakan sintaks ekspresi reguler yang kompatibel dengan Perl, seringkali merupakan alternatif yang lebih cepat untuk ereg ().

Sean Kelleher
sumber
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.

Ivijan Stefan Stipić
sumber
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;
}
lepaskan
sumber
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 = "[email protected]";

// 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";
}
?>
MUFAzmi
sumber