ฉันมีฟังก์ชั่นนี้เพื่อตรวจสอบที่อยู่อีเมล:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
การตรวจสอบว่าที่อยู่อีเมลถูกต้องหรือไม่
ฉันมีฟังก์ชั่นนี้เพื่อตรวจสอบที่อยู่อีเมล:
function validateEMAIL($EMAIL) {
$v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";
return (bool)preg_match($v, $EMAIL);
}
การตรวจสอบว่าที่อยู่อีเมลถูกต้องหรือไม่
คำตอบ:
วิธีที่ง่ายที่สุดและปลอดภัยที่สุดในการตรวจสอบว่าที่อยู่อีเมลมีรูปแบบถูกต้องหรือไม่คือการใช้งานfilter_var()
ฟังก์ชั่น:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}
นอกจากนี้คุณสามารถตรวจสอบว่าโดเมนกำหนดMX
ระเบียน:
if (!checkdnsrr($domain, 'MX')) {
// domain is not valid
}
แต่นี่ก็ยังไม่รับประกันว่าจดหมายนั้นจะมีอยู่ วิธีเดียวที่จะพบว่าเป็นโดยการส่งอีเมลยืนยัน
ตอนนี้คุณมีคำตอบง่าย ๆ อย่าลังเลที่จะอ่านเกี่ยวกับการตรวจสอบที่อยู่อีเมลถ้าคุณสนใจที่จะเรียนรู้หรือใช้คำตอบอย่างรวดเร็วและดำเนินการต่อ ไม่มีความรู้สึกยาก.
การพยายามตรวจสอบที่อยู่อีเมลโดยใช้ regex นั้นเป็นงานที่ "เป็นไปไม่ได้" ฉันจะไปไกลเท่าที่จะบอกว่า regex ที่คุณทำนั้นไร้ประโยชน์ มีอยู่สามประการของ rfc ที่เกี่ยวกับที่อยู่อีเมลและการเขียน regex เพื่อจับที่อยู่อีเมลที่ไม่ถูกต้องและในเวลาเดียวกันไม่มีข้อผิดพลาดที่ผิดพลาดเป็นสิ่งที่มนุษย์ไม่สามารถทำได้ ตรวจสอบรายการนี้สำหรับการทดสอบ (ทั้งล้มเหลวและสำเร็จ) ของ regex ที่ใช้โดยfilter_var()
ฟังก์ชันของ PHP
แม้แต่ฟังก์ชั่น PHP ในตัวไคลเอนต์อีเมลหรือเซิร์ฟเวอร์ก็ไม่ถูกต้อง ในกรณีส่วนใหญ่filter_var
ยังเป็นตัวเลือกที่ดีที่สุด
หากคุณต้องการที่จะทราบว่ารูปแบบ regex PHP (ปัจจุบัน) ใช้ในการตรวจสอบที่อยู่อีเมลดูแหล่งที่มาของ PHP
หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับที่อยู่อีเมลฉันขอแนะนำให้คุณเริ่มอ่านข้อกำหนด แต่ฉันต้องเตือนคุณว่ามันไม่ใช่เรื่องง่ายที่จะอ่าน:
โปรดทราบว่าfilter_var()
ตามที่ระบุไว้แล้วใช้ได้เฉพาะใน PHP 5.2 ในกรณีที่คุณต้องการให้ทำงานกับ PHP เวอร์ชันก่อนหน้าคุณสามารถใช้ regex ที่ใช้ใน PHP:
<?php
$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';
$emailaddress = 'test@gmail.com';
if (preg_match($pattern, $emailaddress) === 1) {
// emailaddress is valid
}
PS หมายเหตุเกี่ยวกับรูปแบบ regex ที่ใช้ด้านบน (จากแหล่ง PHP) มันดูเหมือนว่ามีลิขสิทธิ์บางอย่างกับมันของไมเคิลรัชตัน ตามที่ระบุไว้: "อย่าลังเลที่จะใช้และแจกจ่ายรหัสนี้อีกครั้ง แต่โปรดแจ้งให้ทราบลิขสิทธิ์นี้"
filter_var
จะล่าช้าไปบ้างในบางครั้งแม้ว่าพวกเขาจะเปลี่ยนมันทันที (ฉันได้โพสต์รายงานข้อผิดพลาด)
คุณสามารถใช้filter_varสำหรับสิ่งนี้
<?php
function validateEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
?>
จากประสบการณ์ของฉันregex
การแก้ปัญหามีผลบวกปลอมมากเกินไปและfilter_var()
วิธีแก้ปัญหามีผลเชิงลบที่ผิดพลาด (โดยเฉพาะกับTLDรุ่นใหม่ทั้งหมด)
แต่จะดีกว่าเพื่อให้แน่ใจว่าที่อยู่มีทุกส่วนที่จำเป็นของที่อยู่อีเมล (ผู้ใช้สัญลักษณ์ "@" และโดเมน) จากนั้นตรวจสอบว่าโดเมนนั้นมีอยู่จริง
ไม่มีวิธีกำหนด (ฝั่งเซิร์ฟเวอร์) หากมีผู้ใช้อีเมลสำหรับโดเมนภายนอก
นี่เป็นวิธีที่ฉันสร้างในคลาส Utility:
public static function validateEmail($email)
{
// SET INITIAL RETURN VARIABLES
$emailIsValid = FALSE;
// MAKE SURE AN EMPTY STRING WASN'T PASSED
if (!empty($email))
{
// GET EMAIL PARTS
$domain = ltrim(stristr($email, '@'), '@') . '.';
$user = stristr($email, '@', TRUE);
// VALIDATE EMAIL ADDRESS
if
(
!empty($user) &&
!empty($domain) &&
checkdnsrr($domain)
)
{$emailIsValid = TRUE;}
}
// RETURN RESULT
return $emailIsValid;
}
stristr
จะไม่สามารถรับโดเมนได้หากมีเครื่องหมาย @ หลายรายการ ดีกว่าที่จะexplode('@',$email)
ตรวจสอบสิ่งนั้นsizeof($array)==2
checkdnsrr()
จะกลับเท็จถ้ามีการลงชื่อเข้าใช้ @ ในโดเมน
ฉันคิดว่าคุณน่าจะใช้ตัวกรอง inbuilt ของ PHP ดีกว่าในกรณีนี้:
มันสามารถส่งคืนจริงหรือเท็จเมื่อมาพร้อมกับFILTER_VALIDATE_EMAIL
พารามิเตอร์
สิ่งนี้จะไม่เพียง แต่ตรวจสอบความถูกต้องของอีเมลของคุณ แต่ยังทำให้ถูกต้องสำหรับอักขระที่ไม่คาดคิด:
$email = $_POST['email'];
$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);
if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false ||
$emailB != $email
) {
echo "This email adress isn't valid!";
exit(0);
}
ตอบคำถามนี้ใน 'คำถามยอดนิยม' เกี่ยวกับการยืนยันอีเมลhttps://stackoverflow.com/a/41129750/1848217
สำหรับฉันวิธีการตรวจสอบอีเมลที่ถูกต้องคือ:
- ตรวจสอบว่ามีสัญลักษณ์ @ อยู่และก่อนและหลังมีสัญลักษณ์ที่ไม่ใช่ @:
/^[^@]+@[^@]+$/
- ลองส่งอีเมลไปยังที่อยู่นี้ด้วย "รหัสเปิดใช้งาน"
- เมื่อผู้ใช้ "เปิดใช้งาน" ที่อยู่อีเมลของเขาเราจะเห็นว่าทั้งหมดถูกต้อง
แน่นอนคุณสามารถแสดงคำเตือนหรือคำแนะนำเครื่องมือในส่วนหน้าเมื่อผู้ใช้พิมพ์อีเมล "แปลก" เพื่อช่วยให้เขาหลีกเลี่ยงข้อผิดพลาดทั่วไปเช่นไม่มีจุดในส่วนโดเมนหรือช่องว่างในชื่อโดยไม่ต้องอ้างถึง แต่คุณต้องยอมรับที่อยู่ "hello @ world" หากผู้ใช้ต้องการมันจริงๆ
นอกจากนี้คุณต้องจำไว้ว่ามาตรฐานที่อยู่อีเมลนั้นเป็นและสามารถวิวัฒนาการดังนั้นคุณจึงไม่สามารถพิมพ์ regexp "มาตรฐานที่ถูกต้อง" บางครั้งและทุกครั้ง และคุณต้องจำไว้ว่าเซิร์ฟเวอร์อินเทอร์เน็ตที่เป็นรูปธรรมบางตัวสามารถล้มเหลวในรายละเอียดของมาตรฐานทั่วไปและอันที่จริงแล้วใช้งานได้กับ
ดังนั้นเพียงแค่ตรวจสอบ @ ให้คำแนะนำผู้ใช้ในส่วนหน้าและส่งอีเมลยืนยันตามที่อยู่ที่ระบุ
@
แต่ไม่ได้ตรวจสอบจริง ๆ ว่าถูกต้องสำหรับ RFC ใด ๆ ที่ควบคุมอีเมล มันไม่ทำงานตามที่เขียนไว้ ฉันวิ่งผ่าน regex101.com และไม่สามารถจับคู่ที่อยู่ที่ถูกต้องได้
/^[^@]+@[^@+]$/
ไป/^[^@]+@[^@]+$/
filter_var
วิธีนี้อย่างไร ไม่สามารถแก้ไขปัญหาของการยอมรับที่อยู่ในรูปแบบที่ไม่ดีเช่นกัน regex ของคุณจะยอมรับอย่างมีความสุขjoe@domain
ในฐานะที่อยู่อีเมลที่ถูกต้องเมื่อไม่ใช่
filter_var($email, FILTER_VALIDATE_EMAIL, $newOptions)
ได้ดี แต่คุณมีฟังก์ชั่นเก่า ๆ บนเซิร์ฟเวอร์คุณไม่สามารถอัพเดทได้ในบางกรณี และคุณจะหลวมลูกค้าด้วยอีเมลที่ถูกต้องใหม่ ยิ่งไปกว่านั้นฉันสังเกตเห็นอีกครั้งว่าผู้ให้บริการอีเมลไม่ใช่ทุกคนที่ทำงานอย่างเคร่งครัดตามมาตรฐานที่อยู่อีเมลมาตรฐานและทันสมัยของที่อยู่อีเมล
หากคุณต้องการตรวจสอบว่าโดเมนจากที่อยู่อีเมลถูกต้องหรือไม่ให้ใช้สิ่งที่ต้องการ:
/*
* Check for valid MX record for given email domain
*/
if(!function_exists('check_email_domain')){
function check_email_domain($email) {
//Get host name from email and check if it is valid
$email_host = explode("@", $email);
//Add a dot to the end of the host name to make a fully qualified domain name and get last array element because an escaped @ is allowed in the local part (RFC 5322)
$host = end($email_host) . ".";
//Convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
return checkdnsrr(idn_to_ascii($host), "MX"); //(bool)
}
}
วิธีนี้เป็นวิธีที่มีประโยชน์ในการกรองจำนวนมากที่อยู่อีเมลที่ไม่ถูกต้องพร้อมกับการตรวจสอบอีเมลมาตรฐานเพราะที่ถูกต้องในรูปแบบอีเมลไม่ถูกต้องไม่ได้หมายถึงอีเมล
โปรดทราบว่าidn_to_ascii()
ฟังก์ชั่น (หรือฟังก์ชั่นน้องสาวของเขาidn_to_utf8()
) อาจไม่สามารถใช้งานได้ในการติดตั้ง PHP ของคุณซึ่งต้องใช้ส่วนขยาย PECL intl> = 1.0.2 และ PECL idn> = 0.1
โปรดทราบว่าuser@[IPv6:2001:db8::1]
ไม่สามารถตรวจสอบความถูกต้องของIPv4 หรือ IPv6 เป็นส่วนหนึ่งของโดเมนในอีเมล (ตัวอย่าง) เฉพาะโฮสต์ที่มีชื่อเท่านั้น
หลังจากอ่านคำตอบที่นี่นี่คือสิ่งที่ฉันลงเอยด้วย:
public static function isValidEmail(string $email) : bool
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
//Get host name from email and check if it is valid
$email_host = array_slice(explode("@", $email), -1)[0];
// Check if valid IP (v4 or v6). If it is we can't do a DNS lookup
if (!filter_var($email_host,FILTER_VALIDATE_IP, [
'flags' => FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE,
])) {
//Add a dot to the end of the host name to make a fully qualified domain name
// and get last array element because an escaped @ is allowed in the local part (RFC 5322)
// Then convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
$email_host = idn_to_ascii($email_host.'.');
//Check for MX pointers in DNS (if there are no MX pointers the domain cannot receive emails)
if (!checkdnsrr($email_host, "MX")) {
return false;
}
}
return true;
}
หากคุณเพียงแค่มองหา regex [a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+
ที่เกิดขึ้นจริงที่ช่วยให้การจุดต่างๆและขีดขีดกลางดังต่อไปนี้: ที่จะช่วยให้การtom_anderson.1-neo@my-mail_matrix.com
ตรวจสอบอีเมลที่ค่อนข้างโง่ดูเหมือนว่าจะถูกตรวจสอบ
/(?![[:alnum:]]|@|-|_|\.)./
ทุกวันนี้ถ้าคุณใช้แบบฟอร์ม HTML5 type=email
คุณก็ปลอดภัยแล้ว 80% เนื่องจากเบราว์เซอร์เอ็นจิ้นมีเครื่องมือตรวจสอบของตัวเอง เพื่อเสริมให้เพิ่ม regex นี้ของคุณpreg_match_all()
และคัดค้าน:
if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }
ค้นหา regex ที่ใช้โดยแบบฟอร์ม HTML5 สำหรับการตรวจสอบความถูกต้อง
https://regex101.com/r/mPEKmy/1
validateEmail
จะ corret เช่นเดียวกับที่ผ่านไม่ได้$email
$EMAIL