Saya memiliki fungsi ini untuk memvalidasi alamat email:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
Apakah ini boleh untuk memeriksa apakah alamat email itu valid atau tidak?
php
regex
email
email-validation
Cameron
sumber
sumber
validateEmail
akan corret, serta lewat$email
, tidak$EMAIL
.Jawaban:
Cara termudah dan teraman untuk memeriksa apakah alamat email terbentuk dengan baik adalah dengan menggunakan
filter_var()
fungsi ini:Selain itu Anda dapat memeriksa apakah domain mendefinisikan
MX
catatan:Tetapi ini masih tidak menjamin bahwa surat itu ada. Satu-satunya cara untuk mengetahuinya adalah dengan mengirim surat konfirmasi.
Sekarang setelah Anda mendapatkan jawaban yang mudah, jangan ragu untuk membaca tentang validasi alamat email jika Anda ingin belajar atau cukup gunakan jawaban cepat dan lanjutkan. Tidak ada perasaan keras.
Mencoba memvalidasi alamat email menggunakan regex adalah tugas yang "mustahil". Saya akan mengatakan bahwa regex yang Anda buat tidak berguna. Ada tiga rfc mengenai alamat email dan menulis regex untuk menangkap alamat email yang salah dan pada saat yang sama tidak memiliki positif palsu adalah sesuatu yang tidak dapat dilakukan oleh manusia. Lihatlah daftar ini untuk tes (gagal dan berhasil) dari regex yang digunakan oleh
filter_var()
fungsi PHP .Bahkan fungsi PHP bawaan, klien email atau server tidak dapat melakukannya dengan benar. Masih dalam banyak kasus
filter_var
adalah pilihan terbaik.Jika Anda ingin tahu pola regex mana yang digunakan PHP (saat ini) untuk memvalidasi alamat email, lihat sumber PHP .
Jika Anda ingin mempelajari lebih lanjut tentang alamat email, saya sarankan Anda untuk mulai membaca spesifikasi, tetapi saya harus memperingatkan Anda bahwa itu tidak mudah dibaca oleh peregangan apa pun:
Perhatikan bahwa
filter_var()
sebagaimana telah dinyatakan hanya tersedia pada PHP 5.2. Jika Anda ingin bekerja dengan versi PHP yang lebih lama, Anda bisa menggunakan regex yang digunakan dalam PHP:PS Catatan tentang pola regex yang digunakan di atas (dari sumber PHP). Sepertinya ada beberapa hak cipta di atasnya dari Michael Rushton . Seperti yang dinyatakan: "Jangan ragu untuk menggunakan dan mendistribusikan kembali kode ini. Tetapi harap simpan pemberitahuan hak cipta ini."
sumber
filter_var
akan tertinggal cukup lama, bahkan jika mereka mengubahnya sekarang (saya telah memposting laporan bug).Anda dapat menggunakan filter_var untuk ini.
sumber
Dalam pengalaman saya,
regex
solusi memiliki terlalu banyak positif palsu danfilter_var()
solusi memiliki negatif palsu (terutama dengan semua TLD yang lebih baru ).Alih-alih, lebih baik memastikan bahwa alamat tersebut memiliki semua bagian yang diperlukan dari alamat email (pengguna, "@" simbol, dan domain), lalu verifikasi bahwa domain itu sendiri ada.
Tidak ada cara untuk menentukan (sisi server) jika ada pengguna email untuk domain eksternal.
Ini adalah metode yang saya buat di kelas Utilitas:
sumber
stristr
akan gagal mendapatkan domain jika ada beberapa tanda @. Lebih baik untukexplode('@',$email)
memeriksa itusizeof($array)==2
checkdnsrr()
akan kembali salah jika ada tanda @ di domain.Saya pikir Anda mungkin lebih baik menggunakan filter bawaan PHP - dalam kasus khusus ini:
Itu dapat mengembalikan benar atau salah ketika disertakan dengan
FILTER_VALIDATE_EMAIL
param.sumber
Ini tidak hanya akan memvalidasi email Anda, tetapi juga membersihkannya untuk karakter yang tidak terduga:
sumber
Menjawab ini dalam 'pertanyaan teratas' tentang verifikasi email https://stackoverflow.com/a/41129750/1848217
Jadi, cukup periksa @, beri petunjuk pengguna di frontend dan kirim email verifikasi pada alamat yang diberikan.
sumber
@
, tetapi tidak benar-benar memeriksa apakah itu valid untuk RFC yang mengatur email. Itu juga tidak berfungsi seperti yang tertulis. Saya menjalankannya melalui regex101.com dan gagal mencocokkan alamat yang valid/^[^@]+@[^@+]$/
ke/^[^@]+@[^@]+$/
filter_var
metode? Itu tidak memperbaiki masalah menerima alamat berformat buruk juga. Regex Anda akan dengan senang hati menerimajoe@domain
sebagai alamat email yang valid, padahal bukanfilter_var($email, FILTER_VALIDATE_EMAIL, $newOptions)
. Tetapi Anda memiliki fungsi lama di server, Anda tidak dapat memperbarui dalam beberapa kasus. Dan Anda akan kehilangan klien dengan beberapa email baru yang valid. Juga, sekali lagi saya perhatikan, bahwa tidak semua pengungkit penyajian email bekerja secara ketat sesuai dengan standar umum dan alamat email modern.Jika Anda ingin memeriksa apakah domain yang disediakan dari alamat email itu valid, gunakan sesuatu seperti:
Ini adalah cara praktis untuk memfilter banyak alamat email yang tidak valid, bersama dengan validasi email standar, karena format email yang valid tidak berarti email yang valid .
Perhatikan bahwa
idn_to_ascii()
(atau fungsi kakaknyaidn_to_utf8()
) fungsi mungkin tidak tersedia di instalasi PHP Anda, itu memerlukan ekstensi PECL intl> = 1.0.2 dan PECL idn> = 0.1.Perlu diingat juga bahwa IPv4 atau IPv6 sebagai bagian domain dalam email (misalnya
user@[IPv6:2001:db8::1]
) tidak dapat divalidasi, hanya host yang bernama boleh.Lihat lebih lanjut di sini .
sumber
Setelah membaca jawaban di sini, inilah yang akhirnya saya dapatkan:
sumber
Jika Anda hanya mencari regex yang sebenarnya yang memungkinkan untuk berbagai titik, garis bawah dan garis, sebagai berikut:
[a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+
. Itu akan memungkinkan email yang tampak bodoh sepertitom_anderson.1-neo@my-mail_matrix.com
divalidasi.sumber
Saat ini, jika Anda menggunakan formulir HTML5
type=email
maka Anda sudah 80% aman karena mesin peramban memiliki validator sendiri. Untuk melengkapinya, tambahkan regex ini ke Andapreg_match_all()
dan negasikan:Temukan regex yang digunakan oleh formulir HTML5 untuk validasi
https://regex101.com/r/mPEKmy/1
sumber