ما هي أفضل الممارسات للتحقق من صحة عناوين البريد الإلكتروني على نظام التشغيل iOS 2.0

StackOverflow https://stackoverflow.com/questions/800123

سؤال

ما هي الطريقة الأنظف للتحقق من صحة عنوان البريد الإلكتروني الذي يدخله المستخدم على iOS 2.0؟

ملحوظة:هذا سؤال تاريخي خاص بنظام التشغيل iOS 2.0 ونظرًا لعمره وعدد الأسئلة الأخرى المرتبطة به، لا يمكن إيقافه ويجب عدم تغييره إلى سؤال "حديث".

هل كانت مفيدة؟

المحلول 3

أفضل حل وجدته حتى الآن (والحل الذي انتهى بي الأمر به) هو الإضافة RegexKitLite إلى المشروع الذي يتيح الوصول إلى التعبيرات العادية عبر فئات NSString.

من السهل جدًا الإضافة إلى المشروع، وبمجرد تطبيقها، سيعمل أي من منطق التحقق من صحة البريد الإلكتروني للتعبير العادي.

نصائح أخرى

الجواب على استخدام تعبير عادي للتحقق من صحة عنوان البريد الإلكتروني يشرح بتفصيل كبير أن القواعد النحوية المحددة في 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];
}

قراءة RFC.تقريبًا كل من يعتقد أنه يعرف كيفية تحليل/تنظيف/التحقق من صحة عنوان البريد الإلكتروني مخطئ.

http://tools.ietf.org/html/rfc2822القسم 3.4.1 مفيد جدًا.يلاحظ

dtext           =       NO-WS-CTL /     ; Non white space controls

                        %d33-90 /       ; The rest of the US-ASCII
                        %d94-126        ;  characters not including "[",
                                        ;  "]", or "\"

نعم، هذا يعني أن + و' وما إلى ذلك كلها شرعية.

البداية الجيدة هي أن تقرر ما الذي تريد وما الذي لا تريد قبوله كعنوان بريد إلكتروني؟

99% من عناوين البريد الإلكتروني تبدو كالتالي:bob.smith@foo.com أو fred@bla.edu

ومع ذلك، من القانوني تقنيًا أن يكون لديك عنوان بريد إلكتروني مثل هذا:F!#$%&'*+-/=?^_{|}~"ها!"@com

ربما لا يوجد سوى عدد قليل من رسائل البريد الإلكتروني الصالحة في العالم لنطاقات المستوى الأعلى، ولا يستخدم أحد تقريبًا معظم تلك الأحرف الأخرى (خاصة علامات الاقتباس والعلامات الخلفية)، لذلك قد ترغب في افتراض أن هذه كلها أشياء غير صالحة للقيام بها.ولكن يجب عليك أن تفعل ذلك كقرار واعي.

أبعد من ذلك، افعل ما يقوله بول وحاول مطابقة الإدخال بتعبير عادي مثل هذا:^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,}$

سيطابق هذا العنوان عنوان البريد الإلكتروني للجميع تقريبًا.

في حين أن التركيز على التعبيرات العادية أمر جيد، إلا أن هذه ليست سوى خطوة أولى وضرورية.هناك خطوات أخرى تحتاج أيضًا إلى أخذها في الاعتبار من أجل استراتيجية التحقق الجيدة.

شيئان فوق رأسي هما:

  1. التحقق من صحة DNS للتأكد من وجود المجال بالفعل.

  2. بعد التحقق من صحة نظام أسماء النطاقات، يمكنك أيضًا اختيار إجراء التحقق من صحة SMTP.أرسل مكالمة إلى خادم SMTP لمعرفة ما إذا كان المستخدم موجودًا بالفعل.

وبهذه الطريقة يمكنك اكتشاف جميع أنواع أخطاء المستخدم والتأكد من أنه بريد إلكتروني صالح.

هذه الوظيفة بسيطة ولكنها تتحقق من عنوان البريد الإلكتروني بشكل أكثر شمولاً.على سبيل المثال، وفقًا لـ RFC2822، يجب ألا يحتوي عنوان البريد الإلكتروني على نقطتين متتاليتين، مثل..lastname@domain..com

من المهم أيضًا استخدام نقاط الارتساء في التعبيرات العادية كما هو موضح في هذه الوظيفة.بدون نقاط الارتساء، يعتبر عنوان البريد الإلكتروني التالي صالحًا: first;name)lastname@domain.com(blah بسبب ال lastname@domain.com القسم صالح، تجاهل الاسم الأول) في البداية و (بلاه في نهايةالمطاف.تجبر المراسي محرك التعبيرات العادية على التحقق من صحة البريد الإلكتروني بالكامل.

تستخدم هذه الوظيفة NSPredicate وهو غير موجود في iOS 2.لسوء الحظ، قد لا يساعد السائل، ولكن نأمل أن يساعد الآخرين في الإصدارات الأحدث من iOS.لا يزال من الممكن تطبيق التعبيرات العادية في هذه الوظيفة على RegExKitLite في iOS 2.وبالنسبة لأولئك الذين يستخدمون نظام التشغيل iOS 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];
}

يرى التحقق من صحة عنوان البريد الإلكتروني باستخدام التعبير العادي في Objective-C.

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. 

لقد وجدت أن استخدام التعبير العادي يعمل بشكل جيد للتحقق من صحة عنوان البريد الإلكتروني.

الجانب السلبي الرئيسي للتعبيرات العادية بالطبع هو قابلية الصيانة، لذا قم بالتعليق كما لم تعلق من قبل.أعدك، إذا لم تقم بذلك، فسوف تتمنى لو فعلت ذلك عندما تعود إلى التعبير بعد بضعة أسابيع.

وهذا رابط لمصدر جيد , http://www.regular-expressions.info/email.html.

حفر الأوساخ، ولكنني تعثرت للتو SHEmailValidator الذي يقوم بعمل مثالي ولديه واجهة جميلة.

توفر العديد من مواقع الويب RegExes ولكن من الأفضل أن تتعلمها وتفهمها بالإضافة إلى التحقق من أن ما تريد أن تفعله يلبي احتياجاتك ضمن RFC الرسمي لتنسيقات عناوين البريد الإلكتروني.

لتعلم RegEx، يمكن أن تكون اللغات المترجمة أداة تبسيط واختبار رائعة.تم بناء Rubular على لغة Ruby، ولكنها طريقة جيدة وسريعة للاختبار والتحقق:http://www.rubular.com/

أبعد من ذلك، قم بشراء الإصدار الأخير من كتاب O'Reilly إتقان التعبيرات العادية.ستحتاج إلى قضاء بعض الوقت في فهم الفصول الثلاثة أو الأربعة الأولى.كل شيء بعد ذلك سيكون بناء الخبرة في استخدام RegEx الأمثل للغاية.

غالبًا ما تكون سلسلة من RegExes الأصغر والأسهل في الإدارة أسهل في الصيانة والتصحيح.

فيما يلي امتداد للسلسلة التي تتحقق من صحة البريد الإلكتروني في Swift.

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

لا يجب أن تحاول استخدام regex للتحقق من صحة البريد الإلكتروني.مع تغير نطاقات TLD باستمرار، فإن أداة التحقق الخاصة بك إما أن تكون غير كاملة أو غير دقيقة.بدلا من ذلك، يجب عليك الاستفادة من أبل NSDataDetector المكتبات التي ستأخذ سلسلة وتحاول معرفة ما إذا كانت هناك أي حقول بيانات معروفة (رسائل البريد الإلكتروني والعناوين والتواريخ وما إلى ذلك).ستتولى مجموعة SDK من Apple المهمة الصعبة المتمثلة في مواكبة تحديثات TLDs ويمكنك الاستفادة من جهودها!!:)

بالإضافة إلى ذلك، إذا كان 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)"
    }
}
// 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top