ما يمكن أن يكون التعبير العادية المقبولة عالميا لمطابقة عناوين البريد الإلكتروني

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

سؤال

ولقد رأيت العديد من الأمثلة، مع كثير "لا، فاتك شيء" تعليقات. ما هي الطريقة الصحيحة لمطابقة عنوان البريد الإلكتروني؟

لسلامة العقل خاطر، أسماء النطاقات فقط بالكامل المؤهلة، ويسمح لأيlocalhost. (أو، في كلا الاتجاهين)

ويجب أن يسمح نطاقات فرعية (issac@deptartment.company.museum)

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

المحلول

هذا التعبير العادية يتوافق مع قواعد اللغة وصفها في <ل أ href = "http://www.faqs.org/rfcs/rfc2822.html" يختلط = "noreferrer"> RFC 2822 ، انها طويلة جدا، ولكن القواعد الموضحة في RFC معقد ...

نصائح أخرى

ومن المستحيل أن تفعل ذلك في التعابير المنطقية النقي. Regexen لا يمكن أن تتطابق الأقواس المتداخلة، والتي تتطلب المواصفات RFC كاملة. (أحدث RFC في هذا الشأن هو RFC5322، يطلق سراحهم إلا قبل بضعة أشهر).

والتحقق من صحة كامل من عناوين البريد الإلكتروني يتطلب شيئا على غرار لCFG، وهناك عدد قليل من الأشياء أن نكون حذرين من. على سبيل المثال، يمكن أن تحتوي على عناوين البريد الإلكتروني '\0'، وحرف خالية ... لذلك لا يمكنك استخدام أي من وظائف سلسلة العادية C عليهم.

وأشعر فعلا غريبة بعض الشيء ردا على سؤال مع وصلة إلى شيء كتبته، ولكن كما يحدث ذلك، وأنا واحد أنا أعدت في وقت سابق: قصيرة و(بقدر ما استطيع ان اقول) المصادقة متوافقة تماما في هاسكل. يمكنك نشاهد المصدر الشفرة هنا . أتصور رمز يمكن استدار بسهولة إلى أي مكتبة إعراب مماثلة (ربما Boost.Spirit C ++ الصورة)، أو مجرد مدمن مخدرات بسهولة إلى من لغة أخرى (هاسكل لها <لأ href = "http://www.haskell.org/haskellwiki/ Calling_Haskell_from_C "يختلط =" noreferrer "> طريقة بسيطة جدا لC لاستخدام هاسكل كود ، و<م> كل شيء يمكن استخدام الارتباطات C ...)

وهناك أيضا حالات الاختبار واسعة في شفرة المصدر (لم أكن تصديرها من وحدة)، التي من المقرر أن <لأ href = "http://www.dominicsayers.com/isemail/" يختلط = " noreferrer "> دومينيك القائلون ، الذي لديه نسخته الخاصة من محلل المتوافقة مع RFC في PHP. (العديد من التجارب تفشل، لكنها أكثر صرامة من يحدد RFC5322، لذلك أنا بخير مع أنه في لحظة).

وسئل هذا هنا بضعة أسابيع. ما يتعلق الأمر الى انخفاض هو، وهناك العديد من عناوين القانونية التي من شأنها أن أحد التعابير المنطقية سهلة غير متطابقة. فإنه يأخذ التعابير المنطقية مجنونا حقا لتتناسب مع غالبية عناوين القانونية. وحتى ذلك الحين، والعنوان القانوني نحويا لا يضمن وجود حساب وراء ذلك - اتخاذ foo@example.invalid، على سبيل المثال

وناهيك عن أن يتم السماح أسماء النطاقات الصينية / العربية في المستقبل القريب. كل شخص لديه لتغيير التعبير المعتاد البريد الإلكتروني المستخدم، لأن هذه الشخصيات هي بالتأكيد لا تكون مشمولة [a-z]/i ولا \w. وسوف جميع تفشل.

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

وإذا كان الغرض من التعبير المعتاد هو فقط لإبلاغ بسرعة المستخدم في واجهة المستخدم أن عنوان البريد الإلكتروني المحدد لا يشبه في الشكل الصحيح، وأفضل ما زال للتحقق مما إذا كان يتطابق أساسا التعبير المعتاد التالي:

([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)

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

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

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

وحتى مع وجود اختبار مثالي من الامتثال RFC، anon@ymo.us هو تماما شكل ويشير إلى مجال موجود، لذلك كنت لن تعرف ما إذا كان عنوان نظرا لأنك فعلا صحيح أم لا إلا إذا إرساله رسالة.

ونصائح عامة هي لا

وانها ربما يستحق الاختيار بسيط هو أنها دخلت "something@somethign.something" فقط للتحقق وضعوا البريد الإلكتروني في المربع الصحيح.
أبعد من ذلك أكثر من التعبير المعتاد رسمية تسمح للعديد من الحالات الغامضة التي لديهم معدل ايجابية كاذبة ضخمة (أنها سوف تسمح قانونية من الناحية الفنية ولكن من غير المرجح للغاية مقالات)

http://www.ex-parrot.com /~pdw/Mail-RFC822-Address.html :

والنحوي هو موضح في RFC 822 معقد المدهش. تنفيذ التحقق من صحة مع التعابير العادية يدفع إلى حد ما حدود ما هو معقول أن تفعل مع التعابير العادية، على الرغم من بيرل تتواءم جيدا:

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
 \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
 \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
 \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

إذا كنت تستخدم بيرل، وأعتقد أن وحدة مشتركة من التعبيرات المنتظمة :: أن يكون الشخص الذي ترغب في استخدامه، وعلى وجه الخصوص، التعبيرات المنتظمة :: :: المشترك البريد الإلكتروني :: العناوين.

وكان لي لبناء مؤخرا بعض آر إس إس، وجزء من تلك المدرجة تسير على مخطط XML، بما في ذلك وحدات لمشرفي وManagingEditor، وكلاهما يعرف بأنه عنوان البريد الإلكتروني مطابقة هذا النمط:

([a-zA-Z0-9_\-])([a-zA-Z0-9_\-\.]*)@(\[((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}|((([a-zA-Z0-9\-]+)\.)+))([a-zA-Z]{2,}|(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top