IOS 2.0 पर ईमेल पतों को मान्य करने के लिए सर्वोत्तम अभ्यास क्या हैं


167

एक ईमेल पते को मान्य करने का सबसे साफ तरीका क्या है जो एक उपयोगकर्ता iOS 2.0 पर दर्ज करता है?

नोट : यह एक ऐतिहासिक प्रश्न है जो iOS 2.0 के लिए विशिष्ट है और इसकी उम्र के कारण और कितने अन्य प्रश्न इससे जुड़े हुए हैं इसे सेवानिवृत्त नहीं किया जा सकता है और इसे "आधुनिक" प्रश्न में परिवर्तित नहीं किया जाना चाहिए।


मैं एक कोको समाधान की तलाश में हूं। मैं ईमेल की वैधता और ईमेल को मान्य करने के आसपास के नियमों को समझता हूं। हालाँकि, RegEx कोकोआ टच पर आसानी से उपलब्ध नहीं है, मैं सत्यापन के लिए कोको टच समाधान की तलाश कर रहा हूं। सत्यापन के आसपास नियमों की सूची नहीं।
मार्कस एस। ज़रा

अब तक मुझे मिला सबसे अच्छा कोड सुझाव RegExKitLite और नियमित अभिव्यक्ति का उपयोग करना है। सौभाग्य से यह कम दर्दनाक है जितना लगता है।
मार्कस एस। ज़रा

Os <4.0 का समर्थन नहीं करने वाले ऐप्स के लिए NSRegularExpression का उपयोग करने के बारे में नीचे टिप्पणी देखें।
19

1
चूंकि यह ईमेल पते के सत्यापन के संबंध में विहित प्रश्न प्रतीत होता है, इसलिए यह आईओएस परिपक्वता के रूप में बेहतर उत्तरों के साथ अद्यतन करने के लिए समझ में आता है। इसे ध्यान में रखते हुए, मैंने एक उत्तर जोड़ा है जो NSDataDetectorईमेल पतों को मान्य करने के लिए iOS का उपयोग करता है : stackoverflow.com/a/23547905/257550
मेमोन्स

2
यह प्रश्न ऑफ़-टॉपिक प्रतीत होता है क्योंकि यह iOS 2.0 के बारे में है जो वर्षों पहले पदावनत कर दिया गया था।
नाथन एरोर

जवाबों:


354

ईमेल पते को मान्य करने के लिए एक नियमित अभिव्यक्ति का उपयोग करने का उत्तर बहुत विस्तार से बताता है कि RFC 5322 में निर्दिष्ट व्याकरण आदिम नियमित अभिव्यक्तियों के लिए बहुत जटिल है।

मैं MKEmailAddress की तरह एक असली पार्सर दृष्टिकोण की सलाह देता हूं

त्वरित नियमित अभिव्यक्ति समाधान के रूप में DHValidation के इस संशोधन को देखें :

- (BOOL) validateEmail: (NSString *) candidate {
    NSString *emailRegex =
@"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}"
@"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\"
@"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-"
@"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5"
@"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-"
@"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21"
@"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES[c] %@", emailRegex]; 

    return [emailTest evaluateWithObject:candidate];
}

9
बढ़िया लेकिन OS <3.0 पर काम नहीं करता है, क्योंकि NSPredicate उपलब्ध नहीं है।
फेलिक्सज

4
अच्छा लगा। हर कोई भूल जाता है कि NSPredicate regexps चला सकता है।
रोज

5
यह एक बहुत बुरा regexp है। उदाहरण के लिए, यह .museum शीर्ष डोमेन का उपयोग करने वाले लोगों पर विफल होगा। इस लेख को देखें: linuxjournal.com/article/9585
जॉनी

18
Cocoawithlove.com/2009/06/… पर एक और अधिक पूर्ण रेगेक्स है जिसका उपयोग इस सरल के बजाय किया जा सकता है।
टॉमस एंड्रेल

12
यहां कोको स्ट्रिंग के रूप में एक बहुत ही भोला लेकिन उदार ईमेल रेगेक्स है: @"[^@]+@[^.@]+(\\.[^.@]+)+"यदि आपको एक ईमेल पते को सत्यापित करने की आवश्यकता है, तो उसे एक संदेश भेजें और देखें कि क्या वह सफल होता है। आप अकेले रेगेक्स के साथ किसी भी स्तर की सटीकता के साथ इसे सत्यापित नहीं करेंगे, इसलिए यह सबसे अच्छा है कि उपयोगकर्ताओं को पेशाब न करें और अनावश्यक रूप से सख्त रेगेक्स के कारण साइन अप न करें।
सामी समुरी

20

RFC पढ़ें। लगभग हर कोई जो सोचता है कि वे जानते हैं कि ईमेल पते को पार्स / साफ / मान्य कैसे करें, गलत है।

http://tools.ietf.org/html/rfc2822 धारा 3.4.1 बहुत उपयोगी है। नोटिस

dtext = NO-WS-CTL /; गैर सफेद अंतरिक्ष नियंत्रण

                        % d33-90 /; बाकी US-ASCII
                        % d94-126; "[" सहित वर्ण नहीं,
                                        ; "]", या "\"

हाँ, इसका मतलब है कि +, ', आदि सभी वैध हैं।


मई 2016 के अनुसार वर्तमान: RFC5322, धारा 3.4.1
दुबला

17

अब तक मैंने जो सबसे अच्छा समाधान पाया है (और जिसे मैंने समाप्त किया है) RegexKitLite को जोड़ना है जो उस परियोजना के लिए है जो NSString श्रेणियाँ के माध्यम से नियमित अभिव्यक्ति तक पहुँच प्रदान करती है।

यह परियोजना में जोड़ने के लिए काफी दर्द रहित है और एक बार जगह में, नियमित अभिव्यक्ति ईमेल सत्यापन तर्क में से कोई भी काम करेगा।


5
NSPredicate आपके प्रोजेक्ट में अतिरिक्त लाइब्रेरी जोड़े बिना RegEx कर सकता है।
BadPirate

10
यह सवाल 2009 के अप्रैल से पहले था जब NSPredicate iOS पर मौजूद था।
मार्कस एस। ज़रा

7
जब यह सवाल पूछा गया तो NSRegularExpression DID NOT EXIST in iOS 2.0।
मार्कस एस। ज़रा

9
@ मारकस, स्टैक ओवरफ्लो का मुद्दा ऐतिहासिक रिकॉर्ड बनाए रखना नहीं है कि अतीत में विशेष समस्याओं को कैसे हल किया गया था। उस ने कहा, मैंने 2.0 संगतता कोण पर जोर देने के लिए आपके प्रश्न को संपादित किया है।
बेंज़ादो

2
कृपया शीर्षक पढ़ें, यह iOS 2.0 के लिए है जो कि कैटलन का समाधान मौजूद नहीं था।
मार्कस एस। ज़रा

10

एक अच्छी शुरुआत यह तय करना है कि आप क्या चाहते हैं और क्या आप ईमेल पते के रूप में स्वीकार नहीं करना चाहते हैं?

99% ईमेल पते इस तरह दिखते हैं: bob.smith@foo.com या fred@bla.edu

हालाँकि, इस तरह का ईमेल पता होना तकनीकी रूप से कानूनी है: f !#$%&'*+-/=?^_{|} ~ ~ "ha!" @ Com

शीर्ष-स्तरीय डोमेन के लिए संभवतः दुनिया में केवल कुछ ही मान्य ईमेल हैं, और लगभग कोई भी उन अन्य वर्णों (विशेष रूप से उद्धरण और बैकटिक्स) का उपयोग नहीं करता है, इसलिए आप यह मान सकते हैं कि ये सभी अमान्य चीजें हैं। लेकिन आपको एक सचेत निर्णय के रूप में ऐसा करना चाहिए।

इसके अलावा, पॉल जो कहता है उसे करें और इनपुट को इस तरह एक नियमित अभिव्यक्ति से मिलाने की कोशिश करें: ^ [A-Z0-9 ._% + -] + @ [A-Z0-9 .-] + [AZ] { 2,} $

यह एक बहुत हर किसी के ईमेल पते से मेल खाएगा।


भले ही यह जवाब 2009 में लिखा गया था, यह अभी भी खोज परिणामों में बहुत ऊपर आता है। मैं बस यह जोड़ना चाहता था कि यह अब तक नहीं है और उपरोक्त रेगेक्स थोड़ा प्रतिबंधात्मक है। उदाहरण के लिए, अब आपके पास 4 अंकों या अधिक शीर्ष स्तर का डोमेन हो सकता है
जैक

अच्छा बिंदु, इसे "कम से कम 2 अंकों" में संपादित किया गया। यदि आप चाहें तो आगे संपादित करने के लिए स्वतंत्र महसूस करें।
ब्रैंडन यारब्रॉट

7

जबकि नियमित अभिव्यक्तियों पर ध्यान देना अच्छा है, लेकिन यह केवल एक पहला और आवश्यक कदम है। अन्य कदम भी हैं जिन्हें एक अच्छी सत्यापन रणनीति के लिए भी ध्यान में रखा जाना चाहिए।

मेरे सिर के ऊपर दो चीजें हैं:

  1. DNS सत्यापन यह सुनिश्चित करने के लिए कि डोमेन वास्तव में मौजूद है।

  2. डीएनएस सत्यापन के बाद, आप smtp सत्यापन करना भी चुन सकते हैं। उपयोगकर्ता वास्तव में मौजूद है या नहीं यह देखने के लिए smtp सर्वर पर कॉल भेजें।

इस तरह आप सभी प्रकार की उपयोगकर्ता त्रुटियों को पकड़ सकते हैं और सुनिश्चित कर सकते हैं कि यह एक वैध ईमेल है।


7

यह फ़ंक्शन सरल है और फिर भी ईमेल पते को अधिक अच्छी तरह से जांचता है। उदाहरण के लिए, RFC2822 के अनुसार एक ईमेल पते में एक पंक्ति में दो अवधियों को शामिल नहीं होना चाहिए, जैसे कि firstname..lastname @ domain.com।

इस समारोह में देखा गया कि नियमित अभिव्यक्तियों में एंकर का उपयोग करना भी महत्वपूर्ण है। एंकरों के बिना निम्नलिखित ईमेल पते को वैध माना जाता है: पहला; नाम) lastname@domain.com (blah क्योंकि lastname@domain.com अनुभाग वैध है, पहले की अनदेखी ; नाम) शुरुआत में और अंत में blah । पूरे ईमेल को मान्य करने के लिए नियमित अभिव्यक्ति इंजन।

यह फ़ंक्शन NSPredicate का उपयोग करता है जो iOS 2 में मौजूद नहीं है। दुर्भाग्य से यह पूछने वाले की मदद नहीं कर सकता है, लेकिन उम्मीद है कि iOS के नए संस्करणों के साथ दूसरों की मदद करेगा। इस फ़ंक्शन में नियमित अभिव्यक्तियाँ अभी भी iOS 2 में RegExKitLite पर लागू की जा सकती हैं। और आईओएस 4 या उसके बाद का उपयोग करने वालों के लिए, इन नियमित अभिव्यक्तियों को NSRegularExpression के साथ लागू किया जा सकता है।

- (BOOL)isValidEmail:(NSString *)email
{
    NSString *regex1 = @"\\A[a-z0-9]+([-._][a-z0-9]+)*@([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,4}\\z";
    NSString *regex2 = @"^(?=.{1,64}@.{4,64}$)(?=.{6,100}$).*";
    NSPredicate *test1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex1];
    NSPredicate *test2 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex2];
    return [test1 evaluateWithObject:email] && [test2 evaluateWithObject:email];
}

उद्देश्य-सी में नियमित अभिव्यक्ति का उपयोग करके मान्य ईमेल पता देखें ।


iOS 2.0 में NSPredicate नहीं था।
मार्कस एस। ज़रा

2
लेकिन इस सवाल का उपयोग क्या है और आईओएस 2 का उपयोग क्या है। हम नवीनतम ओएस है जो आईओएस 7.1 है। आप ios 6.
गौरव गिलानी

6
NSString *emailString = textField.text; **// storing the entered email in a string.** 
**// Regular expression to checl the email format.** 
NSString *emailReg = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",emailReg]; 
if (([emailTest evaluateWithObject:emailString] != YES) || [emailStringisEqualToString:@""]) 
{ 
UIAlertView *loginalert = [[UIAlertView alloc] initWithTitle:@" Enter Email in" message:@"abc@example.com format" delegate:self 
cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

enter code here

[loginalert show]; 
[loginalert release]; 
} 
If email is invalid, it will remind the user with an alert box. 
Hope this might be helpful for you all. 

4

मैंने पाया है कि एक ईमेल पते को मान्य करने के लिए एक नियमित अभिव्यक्ति का उपयोग करना काफी अच्छी तरह से काम करता है।

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

यहाँ एक अच्छे स्रोत के लिए लिंक है, http://www . अनियमित-expressions.info/email.html


मैंने हाल ही में उस पृष्ठ पर दूसरा-अंतिम लागू किया, और मैं इससे काफी खुश हूं। यह एक सरल user@host.com ईमेल पते के लिए ठीक काम करता है, जिसमें पूर्ण नाम के लिए कोई उद्धरण या कोष्ठक नहीं है। वेब फ़ॉर्म सत्यापन के लिए बढ़िया काम करता है जहाँ लोग वैसे भी टाइप नहीं करेंगे।
zombat

2
गरीब लोग अपने .museum TLD के साथ।
BadPirate

3

गंदगी खोदना, लेकिन मैं सिर्फ SHEmailValidator पर ठोकर खाई है जो एक आदर्श काम करता है और एक अच्छा इंटरफ़ेस है।


यह प्रश्न iOS 2.0 के लिए विशिष्ट था जिसमें NSPredicate या अन्य चीजों की पूरी मेजबानी नहीं थी जो उस पुस्तकालय में उपयोग की जा रही हैं।
मार्कस एस। ज़रा

1
मुझे पता है, लेकिन मैं "आईओएस ईमेल सत्यापन" की खोज करते हुए यहां पहली बार उतरा। हो सकता है कि कुछ भविष्य में मैं उसी खोज और भूमि का प्रदर्शन करूंगा और यह उसे कुछ समय के लिए बचाएगा।
सिरिल

1

कई वेब साइटें RegExes प्रदान करती हैं, लेकिन आप उन्हें जानने और समझने के साथ-साथ यह सत्यापित करने के लिए भी अच्छा करेंगे कि आप जो करना चाहते हैं, वह ईमेल पते के लिए आधिकारिक RFC के भीतर आपकी आवश्यकताओं को पूरा करता है।

RegEx सीखने के लिए, व्याख्या की गई भाषाएँ एक महान सरलीकृत और परीक्षण की जा सकती हैं। Rubular Ruby पर बनाया गया है, लेकिन परीक्षण और सत्यापन के लिए एक अच्छा त्वरित तरीका है: http://www.rubular.com/

इसके अलावा, ओ'रिली पुस्तक मास्टेरिंग रेगुलर एक्सप्रेशंस का नवीनतम संस्करण खरीदें। आप पहले 3 या 4 अध्यायों को समझने के लिए समय बिताना चाहेंगे। उसके बाद सब कुछ अत्यधिक अनुकूलित RegEx उपयोग पर विशेषज्ञता का निर्माण होगा।

अक्सर छोटे की एक श्रृंखला, RegExes का प्रबंधन करने के लिए आसान बनाए रखने और डिबग करने के लिए आसान है।


0

यहां स्ट्रिंग का एक विस्तार है जो स्विफ्ट में एक ईमेल को मान्य करता है।

extension String {

    func isValidEmail() -> Bool {
        let stricterFilter = false
        let stricterFilterString = "^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"
        let laxString = "^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$"
        let emailRegex = stricterFilter ? stricterFilterString : laxString
        let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegex)
        return emailTest.evaluate(with: self)
    }
}

उत्तर से कॉपी किया गया: जांचें कि iOS पर ईमेल पता मान्य है


NSPredicateIOS 2.0 पर नहीं था
मार्कस एस। ज़रा

-2

ईमेल को मान्य करने के लिए आपको regex का उपयोग करने का प्रयास नहीं करना चाहिए। कभी भी TLD को बदलने के साथ, आपका सत्यापनकर्ता अधूरा या गलत है। इसके बजाय, आपको ऐप्पल के NSDataDetectorपुस्तकालयों का लाभ उठाना चाहिए जो एक स्ट्रिंग लेंगे और यह देखने की कोशिश करेंगे कि क्या कोई ज्ञात डेटा फ़ील्ड (ईमेल, पते, दिनांक, आदि) हैं। एप्पल के एसडीके टीएलडी के साथ अद्यतित रखने की भारी उठाने की कोशिश करेंगे और आप उनके प्रयासों से दूर हो सकते हैं !! :)

इसके अलावा, अगर iMessage (या किसी अन्य पाठ क्षेत्र) को यह ईमेल नहीं लगता है, तो क्या आपको ईमेल पर विचार करना चाहिए?

मैंने इस फ़ंक्शन को एक NSStringश्रेणी में रखा है , इसलिए आप जिस स्ट्रिंग का परीक्षण कर रहे हैं self

- (BOOL)isValidEmail {
    // Trim whitespace first
    NSString *trimmedText = [self stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];
    if (self && self.length > 0) return NO;

    NSError *error = nil;
    NSDataDetector *dataDetector = [[NSDataDetector alloc] initWithTypes:NSTextCheckingTypeLink error:&error];
    if (!dataDetector) return NO;

    // This string is a valid email only if iOS detects a mailto link out of the full string
    NSArray<NSTextCheckingResult *> *allMatches = [dataDetector matchesInString:trimmedText options:kNilOptions range:NSMakeRange(0, trimmedText.length)];
    if (error) return NO;
    return (allMatches.count == 1 && [[[allMatches.firstObject URL] absoluteString] isEqual:[NSString stringWithFormat:@"mailto:%@", self]]);
}

या एक तेजी से Stringविस्तार के रूप में

extension String {
    func isValidEmail() -> Bool {
        let trimmed = self.trimmingCharacters(in: .whitespacesAndNewlines)
        guard !trimmed.isEmpty, let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
            return false
        }
        let allMatches = dataDetector.matches(in: trimmed, options: [], range: NSMakeRange(0, trimmed.characters.count))

        return allMatches.count == 1 && allMatches.first?.url?.absoluteString == "mailto:\(trimmed)"
    }
}

1
यह सवाल आठ साल पहले का है।
मार्कस एस। ज़रा

1
और फिर भी, यदि आप Google validate email objective-c, यह सवाल तीसरा परिणाम है। इंटरनेट पर कुछ चीजें उम्र नहीं होती हैं। :-)
क्रेग ओटिस

1
कृपया हर पोस्ट के नीचे इस उत्तर के लिंक को स्पैमिंग करना बंद करें जो आप पा सकते हैं जो ईमेल पते को मान्य करने से संबंधित है। टिप्पणियाँ स्पष्टीकरण मांगने के लिए हैं, न कि आपके उत्तरों के लिंक स्पैमिंग के लिए।
meagar

BTW, NSDataDetectoriOS 2.0 में मौजूद नहीं था जो कि यह सवाल था / के बारे में है।
मार्कस एस। ज़रा

-7
// Method Call
NSString *email = @"Your Email string..";

BOOL temp = [self validateEmail:email];

if(temp)
{
// Valid
}
else
{
// Not Valid
}
// Method description

- (BOOL) validateEmail: (NSString *) email {
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    BOOL isValid = [emailTest evaluateWithObject:email];
    return isValid;
}

3
यह थ्रेड / प्रश्न NSPredicateiOS 2 के लिए है। iOS 2 में मौजूद नहीं था; यह iOS 3 तक जोड़ा नहीं गया था
मार्कस एस। ज़रा

3
मैंने उत्तर दिया क्योंकि आपका उत्तर गलत है। सवाल यह है कि "आप iOS Y पर X कैसे करते हैं" और आपने एक ऐसे ढांचे के साथ उत्तर दिया जो iOS के उस संस्करण पर मौजूद नहीं है।
मार्कस एस। ज़रा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.