मेरे पास ईमेल पतों को मान्य करने के लिए यह कार्य है:
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
}
लेकिन यह अभी भी गारंटी नहीं देता है कि मेल मौजूद है। यह पता लगाने का एकमात्र तरीका एक पुष्टिकरण मेल भेजकर है।
अब जब आपके पास अपना आसान उत्तर है, तो ईमेल पता सत्यापन के बारे में जानने के लिए स्वतंत्र महसूस करें यदि आप सीखने की परवाह करते हैं या अन्यथा बस तेज़ उत्तर का उपयोग करें और आगे बढ़ें। बुरा न मानो।
रेगेक्स का उपयोग करके एक ईमेल पते को मान्य करने की कोशिश करना एक "असंभव" कार्य है। मैं यह कहना चाहूंगा कि आपने जो रेगेक्स बनाया है, वह बेकार है। Emailaddresses के बारे में तीन rfc हैं और गलत emailadresses को पकड़ने के लिए एक regex लिख रहे हैं और एक ही समय में झूठी सकारात्मकता नहीं है, ऐसा कोई भी व्यक्ति नहीं कर सकता है। PHP के फ़ंक्शन द्वारा उपयोग किए गए regex के परीक्षण (असफल और सफल दोनों) के लिए इस सूची को देखें filter_var()
।
यहां तक कि अंतर्निहित PHP फ़ंक्शन, ईमेल क्लाइंट या सर्वर इसे सही नहीं पाते हैं। अभी भी ज्यादातर मामलों में सबसे filter_var
अच्छा विकल्प है।
यदि आप जानना चाहते हैं कि कौन से रेगेक्स पैटर्न PHP (वर्तमान में) ईमेल पते को मान्य करने के लिए उपयोग करता है तो PHP स्रोत देखें ।
यदि आप ईमेल पते के बारे में अधिक जानना चाहते हैं, तो मैं आपको चश्मा पढ़ना शुरू करने का सुझाव देता हूं, लेकिन मुझे आपको आगाह करना होगा कि यह किसी भी तरह से आसान नहीं है:
ध्यान दें कि filter_var()
जैसा कि पहले ही बताया गया है केवल PHP 5.2 के रूप में उपलब्ध है। यदि आप चाहते हैं कि यह PHP के पुराने संस्करणों के साथ काम करे, तो आप PHP में उपयोग किए गए regex का उपयोग कर सकते हैं:
<?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
}
पीएस ए ऊपर (PHP स्रोत से) regex पैटर्न पर एक नोट। ऐसा लगता है कि माइकल रशटन पर इसका कुछ कॉपीराइट है । जैसा कि कहा गया है: "इस कोड का उपयोग करने और पुनर्वितरित करने के लिए स्वतंत्र महसूस करें। लेकिन कृपया इस कॉपीराइट नोटिस को रखें।"
filter_var
काफी समय से पिछड़ जाएगा, भले ही वे इसे अभी बदल दें (मैंने एक बग रिपोर्ट पोस्ट की है)।
इसके लिए आप filter_var का उपयोग कर सकते हैं ।
<?php
function validateEmail($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
?>
मेरे अनुभव में, regex
समाधानों में बहुत सी झूठी सकारात्मकताएँ हैं और filter_var()
समाधानों में झूठी नकारात्मकताएँ हैं (विशेष रूप से सभी नए TLDs के साथ )।
इसके बजाय, यह सुनिश्चित करना बेहतर है कि पते में ईमेल पते (उपयोगकर्ता, "@" प्रतीक और डोमेन) के सभी आवश्यक भाग हैं, फिर सत्यापित करें कि डोमेन स्वयं मौजूद है।
यदि कोई ईमेल उपयोगकर्ता किसी बाहरी डोमेन के लिए मौजूद है, तो यह निर्धारित करने का कोई तरीका नहीं है (सर्वर साइड)।
यह एक ऐसा तरीका है जिसे मैंने उपयोगिता वर्ग में बनाया है:
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()
वापस आएगी क्योंकि डोमेन में कोई @ चिह्न थे।
यह न केवल आपके ईमेल को मान्य करेगा, बल्कि अनपेक्षित वर्णों के लिए इसे पवित्र भी करेगा:
$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 के बारे में 'शीर्ष प्रश्न' में इसका उत्तर दिया
मेरे लिए ईमेल जाँचने का सही तरीका है:
- जाँच करें कि प्रतीक @ मौजूद है, और इससे पहले और उसके बाद कुछ गैर- @ प्रतीक हैं:
/^[^@]+@[^@]+$/
- कुछ "सक्रियण कोड" के साथ इस पते पर एक ईमेल भेजने की कोशिश करें।
- जब उपयोगकर्ता अपने ईमेल पते को "सक्रिय" करता है, तो हम देखेंगे कि सब सही है।
बेशक, आप कुछ गलतियाँ या टूलटिप दिखा सकते हैं जब उपयोगकर्ता सामान्य गलतियों से बचने में मदद करने के लिए "अजीब" ईमेल टाइप करता है, जैसे कि बिना उद्धृत किए डोमेन नेम या स्पेस में डॉट और बिना नाम के। यदि आप उपयोगकर्ता वास्तव में चाहते हैं, तो आपको "हैलो @ वर्ल्ड" का पता स्वीकार करना होगा।
इसके अलावा, आपको यह याद रखना चाहिए कि ईमेल पता मानक था और विकसित हो सकता है, इसलिए आप एक बार और सभी समय के लिए कुछ "मानक-मान्य" regexp टाइप नहीं कर सकते। और आपको याद रखना चाहिए कि कुछ ठोस इंटरनेट सर्वर सामान्य मानक के कुछ विवरणों को विफल कर सकते हैं और वास्तव में स्वयं "संशोधित मानक" के साथ काम करते हैं।
तो, बस चेक करें @, संकेत पर उपयोगकर्ता को इंगित करें और दिए गए पते पर सत्यापन ईमेल भेजें।
@
, लेकिन यह वास्तव में जाँच नहीं करता है कि यह ईमेल को संचालित करने वाले किसी भी RFC के अनुसार मान्य है। यह लिखित रूप में भी काम नहीं करता है। मैंने इसे regex101.com के माध्यम से चलाया और यह वैध पते से मेल खाने में विफल रहा
/^[^@]+@[^@+]$/
किया/^[^@]+@[^@]+$/
filter_var
विधि पर कैसे सुधार करता है ? यह बुरी तरह से स्वरूपित पते को स्वीकार करने की समस्या को ठीक नहीं करता है। आपका रेगेक्स ख़ुशी से 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 की आवश्यकता होती है।
यह भी ध्यान रखें कि ईमेल में IPv4 या IPv6 डोमेन भाग के रूप में (उदाहरण के लिए user@[IPv6:2001:db8::1]
) को मान्य नहीं किया जा सकता है, जिसे केवल होस्ट्स नाम दिया जा सकता है।
अधिक देखें यहाँ ।
यहाँ उत्तरों को पढ़ने के बाद, यही मैंने समाप्त किया:
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;
}
यदि आप केवल एक वास्तविक रेगेक्स की तलाश कर रहे हैं जो विभिन्न डॉट्स, अंडरस्कोर और डैश के लिए अनुमति देता है, तो यह निम्नानुसार है [a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+
:। यह एक काफी बेवकूफ लग रही ईमेल tom_anderson.1-neo@my-mail_matrix.com
को मान्य करने की अनुमति देगा ।
/(?![[:alnum:]]|@|-|_|\.)./
आजकल, यदि आप एचटीएमएल 5 फॉर्म का उपयोग करते हैं, तो आप type=email
पहले से ही 80% सुरक्षित हैं क्योंकि ब्राउज़र इंजन का अपना सत्यापनकर्ता है। इसे पूरक करने के लिए, इस रेगेक्स को अपने साथ जोड़ें preg_match_all()
और इसे नकारात्मक करें:
if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }
सत्यापन के लिए HTML5 रूपों द्वारा उपयोग किए गए regex
https://regex101.com/r/mPEKmy/1 पर जाएं
validateEmail
शव होगा, साथ ही गुजर रहा है$email
, नहीं$EMAIL
।