PHP में ईमेल कैसे मान्य करें?


120

मैं इनपुट वैल्यू को कैसे मान्य कर सकता हूं यह php5 का उपयोग करके एक मान्य ईमेल पता है। अब मैं इस कोड का उपयोग कर रहा हूं

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; 
     }    
} 

लेकिन यह दर्शाया गया त्रुटि दिखाता है। मैं इस समस्या को कैसे हल कर सकता हूं। क्रिप्या मेरि सहायता करे।


3
सही उत्तर पहले से ही दिया गया था, लेकिन हटाए गए मुद्दे के बारे में : पोसिक्स नियमित अभिव्यक्तियों (जो eregiकि एक समारोह है) का उपयोग पदावनत है। इसकी जगह पीसीआरई का इस्तेमाल करें ।
फेलिक्स क्लिंग

3
वैसे, आपका रेगेक्स पूरी तरह से गलत है। कुछ पूरी तरह से मान्य विज्ञापनों को आपके फ़ंक्शन द्वारा अमान्य के रूप में चिह्नित किया जाएगा। एक regex के साथ ईमेल को फ़िल्टर करना एक बुरा सपना है।
अर्टफैक्ट

आपको RFC 822 मानक का उपयोग करना चाहिए और यहां PHP में एक अच्छा लेख पार्सिंग ईमेल पता है जो इसे समझाता है।
काटा

जवाबों:


275

आप filter_var()फ़ंक्शन का उपयोग कर सकते हैं , जो आपको बहुत अधिक सत्यापन और स्वच्छता विकल्प प्रदान करता है।

filter_var($email, FILTER_VALIDATE_EMAIL)

यदि आप अपना कोड बदलना नहीं चाहते हैं जो आपके कार्य पर निर्भर है, तो बस करें:

function isValidEmail($email){ 
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

नोट : अन्य उपयोगों के लिए (जहां आपको Regex की आवश्यकता है), पदावनत किए गए eregफ़ंक्शन परिवार (POSIX Regex Functions) को pregपरिवार ( PCRE Regex Functions ) द्वारा प्रतिस्थापित किया जाना चाहिए । थोड़ी मात्रा में मतभेद हैं, मैनुअल पढ़ना पर्याप्त होना चाहिए।

अद्यतन 1 : जैसा कि @binaryLV द्वारा बताया गया है :

PHP 5.3.3 और 5.2.14 में FILTER_VALIDATE_EMAIL से संबंधित बग था , जिसके परिणामस्वरूप बड़े मूल्यों को मान्य करते समय सेगफॉल्ट हुआ। इसके लिए सरल और सुरक्षित समाधान strlen() पहले उपयोग कर रहा है filter_var()। मुझे 5.3.4 फाइनल के बारे में निश्चित नहीं है, लेकिन यह लिखा है कि कुछ 5.3.4-स्नैपशॉट संस्करण भी प्रभावित हुए थे।

यह बग पहले ही तय किया जा चुका है।

अद्यतन 2 : यह विधि निश्चित bazmega@kapaरूप से मान्य ईमेल पते के रूप में मान्य होगी, क्योंकि वास्तव में यह एक मान्य ईमेल पता है। लेकिन इंटरनेट पर समय के सबसे अधिक, आप भी ईमेल पते एक टीएलडी करना चाहते हैं: bazmega@kapa.com। जैसा कि इस ब्लॉग पोस्ट में सुझाव दिया गया है ( @Istiaque Ahmed द्वारा पोस्ट किया गया लिंक ), आप filter_var()एक regex के साथ वृद्धि कर सकते हैं जो डोमेन भाग में एक डॉट के अस्तित्व की जांच करेगा ( हालांकि एक वैध TLD के लिए जांच नहीं करेगा ):

function isValidEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) 
        && preg_match('/@.+\./', $email);
}

जैसा कि @Eliseo Ocampos ने बताया, यह समस्या केवल PHP 5.3 से पहले मौजूद है, उस संस्करण में उन्होंने regex को बदल दिया था और अब यह इस जाँच को करता है, इसलिए आपको करने की आवश्यकता नहीं है।


4
+1 जो कहा गया है, आप उल्लेख करना चाहते हैं कि यह केवल PHP 5.2.x और इसके बाद के संस्करण में उपलब्ध है। :-)
जॉन पार्कर

5
@ मिदापारका: जैसा कि ओपी के लिए एक पदावनत संदेश प्राप्त होता है eregi, ऐसा लगता है कि वह PHP 5.3 का उपयोग कर रहा है। लेकिन हां, इसका उल्लेख करना महत्वपूर्ण है (दूसरों के लिए)।
फेलिक्स क्लिंग

8
PHP 5.3.3 और 5.2.14 में एक बग ( Bugs.php.net/52929 ) था FILTER_VALIDATE_EMAIL, जिसके परिणामस्वरूप बड़े मूल्यों को मान्य करते समय सेगफॉल्ट हुआ। इसके लिए सरल और सुरक्षित समाधान strlen()पहले उपयोग कर रहा है filter_val()। मुझे 5.3.4 फाइनल के बारे में निश्चित नहीं है, लेकिन यह लिखा है कि कुछ 5.3.4-स्नैपशॉट संस्करण भी प्रभावित हुए थे।
बाइनरीएलवी

1
@ BinaryLV, filter_valया filter_var?
इस्तियाक अहमद

3
@kapa, वास्तव में आपको डोमेन भाग में एक डॉट की जाँच करने के लिए किसी और की आवश्यकता नहीं है। देखें svn.php.net/viewvc/php/php-src/branches/PHP_5_3/ext/filter/...
एल्सियो Ocampos

9

Http://www.php.net/manual/en/function.ereg.php पर नोट देखें :

Note:

PHP 5.3.0 के रूप में, रेगेक्स एक्सटेंशन को PCRE एक्सटेंशन के पक्ष में चित्रित किया गया है । इस फ़ंक्शन को कॉल करने से E_DEPRECATED सूचना जारी होगी। पीसीआरई में परिवर्तित करने में मदद के लिए मतभेदों की सूची देखें ।

Note:

preg_match () , जो पर्ल-संगत नियमित अभिव्यक्ति सिंटैक्स का उपयोग करता है, अक्सर ereg () का एक तेज़ विकल्प होता है।


7

यह पुरानी पोस्ट है लेकिन मैं अपना एक समाधान साझा करूंगा क्योंकि किसी ने भी यहां एक समस्या का उल्लेख नहीं किया है।

नए ईमेल पते में UTF-8 अक्षर या विशेष डोमेन नाम हो सकते हैं .live,.news आदि।

इसके अलावा, मुझे पता है कि कुछ ईमेल पते सिरिलिक और सभी मामलों में मानक रेगेक्स या हो सकते हैं filter_var() हो सकते हैं विफल होंगे।

इसलिए मैंने इसके लिए एक समाधान बनाया:

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;
        }
    }
}

यह फ़ंक्शन सभी मामलों और ईमेल प्रारूपों के लिए पूरी तरह से काम करता है।


3

मैं हमेशा इसका उपयोग करता हूं:

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 मैंने आपका कोड आज़माया है और पाया है कि यदि आप ईमेल पास करते हैं alex@.तो यह हमेशा सही रहता है जहाँ यह एक मान्य ईमेल पता नहीं है।
सुभजीत



0

एक अच्छे डेवलपर के लिए उपयोगकर्ता डेटा बहुत महत्वपूर्ण है, इसलिए एक ही डेटा के लिए बार-बार न पूछें, डेटा में कुछ बुनियादी त्रुटि को ठीक करने के लिए कुछ तर्क का उपयोग करें।

ईमेल के सत्यापन से पहले: पहले आपको ईमेल से सभी अवैध पात्रों को हटाना होगा।

//This will Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);

उसके बाद इस filter_var()फ़ंक्शन का उपयोग करके अपने ईमेल पते को मान्य करें ।

filter_var($email, FILTER_VALIDATE_EMAIL)) // To Validate the email

उदाहरण के लिए

<?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";
}
?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.