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.