regex - PHP में किसी ईमेल को कैसे सत्यापित करें?




validation email-validation (5)

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

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

मैं इनपुट मान को कैसे मान्य कर सकता हूं 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; 
     }    
} 

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


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

filter_var($email, FILTER_VALIDATE_EMAIL)

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

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

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

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

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

यह बग पहले ही तय कर दिया गया है।

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

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

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


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

Note:

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

Note:

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


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

नए ईमेल पते में यूटीएफ -8 अक्षरों या विशेष डोमेन नाम जैसे .news , .news इत्यादि शामिल हो सकते हैं।

इसके अलावा मुझे लगता है कि कुछ ईमेल पता सिरिलिक पर हो सकते हैं और सभी मामलों में मानक regex या 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;
        }
    }
}

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


अगर मुझे गलत नहीं लगता है, तो यह किसी भी वैध जावास्क्रिप्ट नंबर मान से मेल खाता है, जिसमें स्थिरांक ( Infinity , NaN ) और साइन ऑपरेटर + / - को छोड़कर (क्योंकि वे वास्तव में जहां तक ​​मुझे चिंतित हैं, वे अलग-अलग ऑपरेटर हैं ):

मुझे इसे टोकननाइज़र के लिए जरूरी था, जहां मूल्यांकन के लिए जावास्क्रिप्ट को संख्या भेजना एक विकल्प नहीं था ... यह निश्चित रूप से सबसे कम संभव नियमित अभिव्यक्ति नहीं है, लेकिन मेरा मानना ​​है कि यह जावास्क्रिप्ट के संख्या वाक्यविन्यास के सभी बेहतर subtleties पकड़ता है।

/^(?:(?:(?:[1-9]\d*|\d)\.\d*|(?:[1-9]\d*|\d)?\.\d+|(?:[1-9]\d*|\d)) 
(?:[e]\d+)?|0[0-7]+|0x[0-9a-f]+)$/i

मान्य संख्या में शामिल होंगे:

 - 0
 - 00
 - 01
 - 10
 - 0e1
 - 0e01
 - .0
 - 0.
 - .0e1
 - 0.e1
 - 0.e00
 - 0xf
 - 0Xf

अमान्य संख्या होगी

 - 00e1
 - 01e1
 - 00.0
 - 00x0
 - .
 - .e0




php regex validation email-validation