كيفية التحقق من صحة عنوان البريد الإلكتروني في جافا سكريبت؟

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

سؤال

كيف يمكن التحقق من صحة عنوان البريد الإلكتروني في JavaScript؟

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

المحلول

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

function validateEmail(email) {
    var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(String(email).toLowerCase());
}

إليك مثال التعبير العادي الذي يقبل يونيكود:

var re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;

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

فيما يلي مثال على ما ورد أعلاه في العمل:

function validateEmail(email) {
  var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  return re.test(email);
}

function validate() {
  var $result = $("#result");
  var email = $("#email").val();
  $result.text("");

  if (validateEmail(email)) {
    $result.text(email + " is valid :)");
    $result.css("color", "green");
  } else {
    $result.text(email + " is not valid :(");
    $result.css("color", "red");
  }
  return false;
}

$("#validate").on("click", validate);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form>
  <p>Enter an email address:</p>
  <input id='email'>
  <button type='submit' id='validate'>Validate!</button>
</form>

<h2 id='result'></h2>

نصائح أخرى

فقط من أجل الاكتمال هنا لديك تعبير عادي آخر متوافق مع RFC 2822

يُعرف المعيار الرسمي باسم آر إف سي 2822.وهو يصف بناء الجملة الذي يجب أن تلتزم به عناوين البريد الإلكتروني الصالحة.أنت تستطيع (ولكن لا ينبغي لكواصل القراءة) قم بتنفيذه باستخدام هذا التعبير العادي:

(?:[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])+)\])

(...) نحصل على تطبيق عملي أكثر لـ RFC 2822 إذا حذفنا بناء الجملة باستخدام علامات الاقتباس المزدوجة والأقواس المربعة. وسيظل مطابقًا لـ 99.99% من جميع عناوين البريد الإلكتروني المستخدمة فعليًا اليوم.

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

التغيير الآخر الذي يمكنك إجراؤه هو السماح لأي نطاق المستوى الأعلى لرمز البلد المكون من حرفين، ونطاقات المستوى الأعلى العامة المحددة فقط. يقوم هذا التعبير العادي بتصفية عناوين البريد الإلكتروني الوهمية مثل asdf@adsf.adsf.أنت سوف تحتاج إلى تحديثه عند إضافة نطاقات المستوى الأعلى الجديدة.

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

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

التأكيد على الألغام

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

Anystring@anystring.anystring

التعبير العادي:

/\S+@\S+\.\S+/

مثال على وظيفة جافا سكريبت:

function validateEmail(email) 
{
    var re = /\S+@\S+\.\S+/;
    return re.test(email);
}

واو، هناك الكثير من التعقيد هنا.إذا كان كل ما تريد فعله هو اكتشاف الأخطاء النحوية الأكثر وضوحًا، فسأفعل شيئًا مثل هذا:

^\S+@\S+$

عادةً ما يكتشف الأخطاء الأكثر وضوحًا التي يرتكبها المستخدم ويؤكد أن النموذج صحيح في الغالب، وهو ما يدور حوله التحقق من صحة JavaScript.

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

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

يحتوي HTML5 نفسه على التحقق من صحة البريد الإلكتروني.إذا كان متصفحك يدعم HTML5 فيمكنك استخدام الكود التالي.

<form><input type="email" placeholder="me@example.com" required>
    <input type="submit">
</form>

jsFiddle وصلة

من مواصفات HTML5:

أ عنوان بريد الكتروني مفعّل هي سلسلة تتطابق مع email إنتاج ABNF التالي، مجموعة الأحرف الخاصة به هي Unicode.

email   = 1*( atext / "." ) "@" label *( "." label )
label   = let-dig [ [ ldh-str ] let-dig ]  ; limited to a length of 63 characters by RFC 1034 section 3.5
atext   = < as defined in RFC 5322 section 3.2.3 >
let-dig = < as defined in RFC 1034 section 3.5 >
ldh-str = < as defined in RFC 1034 section 3.5 >

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

التعبير العادي المتوافق مع JavaScript وPerl التالي هو تطبيق للتعريف أعلاه.

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

لقد وجدت أن هذا هو الحل الأفضل:

/^[^\s@]+@[^\s@]+\.[^\s@]+$/

يسمح بالتنسيقات التالية:

1.  prettyandsimple@example.com
2.  very.common@example.com
3.  disposable.style.email.with+symbol@example.com
4.  other.email-with-dash@example.com
9.  #!$%&'*+-/=?^_`{}|~@example.org
6.  "()[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a"@example.org
7.  " "@example.org (space between the quotes)
8.  üñîçøðé@example.com (Unicode characters in local part)
9.  üñîçøðé@üñîçøðé.com (Unicode characters in domain part)
10. Pelé@example.com (Latin)
11. δοκιμή@παράδειγμα.δοκιμή (Greek)
12. 我買@屋企.香港 (Chinese)
13. 甲斐@黒川.日本 (Japanese)
14. чебурашка@ящик-с-апельсинами.рф (Cyrillic)

من الواضح أنه متعدد الاستخدامات ويسمح بالشخصيات الدولية المهمة للغاية، مع الاستمرار في فرض التنسيق الأساسي Anything@anything.anything.سيؤدي ذلك إلى حظر المساحات التي يسمح بها RFC تقنيًا، لكنها نادرة جدًا لدرجة أنني سعيد للقيام بذلك.

في المتصفحات الحديثة، يمكنك البناء على إجابة @Sushil باستخدام JavaScript خالص و DOM:

function validateEmail(value) {
  var input = document.createElement('input');

  input.type = 'email';
  input.required = true;
  input.value = value;

  return typeof input.checkValidity === 'function' ? input.checkValidity() : /\S+@\S+\.\S+/.test(value);
}

لقد قمت بتجميع مثال في الكمان http://jsfiddle.net/boldewyn/2b6d5/.جنبا إلى جنب مع الكشف عن الميزات والتحقق من صحة العظام من إجابة Squirtle, إنه يحررك من مذبحة التعبير العادي ولا يزعج المتصفحات القديمة.

يمكن أن تتطابق JavaScript مع التعبير العادي:

emailAddress.match( / some_regex /);

هنا RFC22 التعبير العادي لرسائل البريد الإلكتروني:

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*
"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x
7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<
!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])
[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

هذا هو الإصدار الصحيح من RFC822.

function checkEmail(emailAddress) {
  var sQtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
  var sDtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
  var sAtom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
  var sQuotedPair = '\\x5c[\\x00-\\x7f]';
  var sDomainLiteral = '\\x5b(' + sDtext + '|' + sQuotedPair + ')*\\x5d';
  var sQuotedString = '\\x22(' + sQtext + '|' + sQuotedPair + ')*\\x22';
  var sDomain_ref = sAtom;
  var sSubDomain = '(' + sDomain_ref + '|' + sDomainLiteral + ')';
  var sWord = '(' + sAtom + '|' + sQuotedString + ')';
  var sDomain = sSubDomain + '(\\x2e' + sSubDomain + ')*';
  var sLocalPart = sWord + '(\\x2e' + sWord + ')*';
  var sAddrSpec = sLocalPart + '\\x40' + sDomain; // complete RFC822 email address spec
  var sValidEmail = '^' + sAddrSpec + '$'; // as whole string

  var reValidEmail = new RegExp(sValidEmail);

  return reValidEmail.test(emailAddress);
}

تحتوي جميع عناوين البريد الإلكتروني على "at" (أي@) رمز.اختبار هذا الشرط الضروري:

email.indexOf("@") > 0

لا تهتم بأي شيء أكثر تعقيدًا.حتى لو كان بإمكانك تحديد ما إذا كان البريد الإلكتروني صالحًا من الناحية التركيبية لـ RFC، فلن يخبرك ذلك ما إذا كان ينتمي إلى الشخص الذي قدمه أم لا.هذا ما يهم حقا.

لاختبار ذلك، قم بإرسال رسالة التحقق من الصحة.

لا يعد التحقق الصحيح من صحة عنوان البريد الإلكتروني بما يتوافق مع طلبات RFC أمرًا يمكن تحقيقه باستخدام تعبير عادي أحادي السطر.مقال يحتوي على أفضل الحلول التي وجدتها في PHP هو ما هو عنوان البريد الإلكتروني الصالح؟.من الواضح أنه تم نقله إلى Java. أعتقد أن الوظيفة معقدة جدًا بحيث لا يمكن نقلها واستخدامها في JavaScript. منفذ جافا سكريبت/node.js: https://www.npmjs.com/package/email-addresses.

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

إليك وظيفة JavaScript التي أستخدمها للتحقق مما إذا كانت السلسلة تبدو كعنوان بريد صالح:

function looksLikeMail(str) {
    var lastAtPos = str.lastIndexOf('@');
    var lastDotPos = str.lastIndexOf('.');
    return (lastAtPos < lastDotPos && lastAtPos > 0 && str.indexOf('@@') == -1 && lastDotPos > 2 && (str.length - lastDotPos) > 2);
}

توضيح:

  • lastAtPos < lastDotPos:آخر @ ينبغي أن يكون قبل الأخير . منذ @ لا يمكن أن يكون جزءًا من اسم الخادم (على حد علمي).

  • lastAtPos > 0:يجب أن يكون هناك شيء ما (اسم مستخدم البريد الإلكتروني) قبل الأخير @.

  • str.indexOf('@@') == -1:لا ينبغي أن يكون هناك @@ في العنوان.حتى لو @ يظهر كالحرف الأخير في اسم مستخدم البريد الإلكتروني، ويجب أن يتم اقتباسه بذلك " سيكون بين ذلك @ وآخر @ في العنوان.

  • lastDotPos > 2:يجب أن يكون هناك ثلاثة أحرف على الأقل قبل النقطة الأخيرة، على سبيل المثال a@b.com.

  • (str.length - lastDotPos) > 2:يجب أن يكون هناك عدد كافٍ من الأحرف بعد النقطة الأخيرة لتكوين مجال مكون من حرفين.لست متأكدًا مما إذا كانت الأقواس ضرورية.

هذه مسروقة من http://codesnippets.joyent.com/posts/show/1917

email = $('email');
filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (filter.test(email.value)) {
  // Yay! valid
  return true;
}
else
  {return false;}

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

  • إبداعي
    /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

  • معدل
    /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+[^<>()\.,;:\s@\"]{2,})$/

لتمرير الأمثلة في عنوان البريد الإلكتروني ويكيبيديا.

ويمكنك رؤية النتيجة في هنا.

enter image description here

افعل هذا:

[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?

لماذا؟ انها على أساس آر إف سي 2822, ، وهو معيار يجب أن تلتزم به جميع عناوين البريد الإلكتروني.ولست متأكدًا من سبب اهتمامك بشيء "أبسط" ...ستقوم بنسخها ولصقها على أي حال ;)

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

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

فيما يلي مثال على استخدامه في JavaScript (مع العلامة غير الحساسة لحالة الأحرف i في نهايةالمطاف).

var emailCheck=/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
console.log( emailCheck.test('some.body@domain.co.uk') );

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

مزيد من المعلومات: http://www.regular-expressions.info/email.html

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

الآن بما أنك تستطيع تغطية 90% فقط من الحالات، فاكتب شيئًا مثل:

function isPossiblyValidEmail(txt) {
   return txt.length > 5 && txt.indexOf('@')>0;
}

يمكنك تحسينه.على سبيل المثال، "aaa@" صالح.لكن بشكل عام تحصل على الجوهر.ولا تبتعدوا...الحل البسيط بنسبة 90% أفضل من الحل بنسبة 100% الذي لا يعمل.

العالم يحتاج إلى كود أبسط...

ما عليك سوى التحقق مما إذا كان عنوان البريد الإلكتروني الذي تم إدخاله صالحًا أم لا يستخدم HTML.

<input type="email"/>

ليست هناك حاجة لكتابة دالة للتحقق من صحتها.

هذه هي الطريقة مدقق العقدة يفعل ذلك:

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/

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

بعض الأشياء للتحسين:

بدلا من الجديد RegExp, ، فقط حاول كتابة regexp خارج مثل هذا:

if (reg.test(/@/))

ثانيا، تأكدي من أن الدورة الشهرية تأتي بعد الدورة الشهرية @ التوقيع، والتأكد من وجود أحرف بين @ق والفترات.

استخدم هذا الرمز داخل وظيفة التحقق من الصحة:

var emailID = document.forms["formName"]["form element id"].value;
atpos = emailID.indexOf("@");
dotpos = emailID.lastIndexOf(".");
if (atpos < 1 || ( dotpos - atpos < 2 ))
{
    alert("Please enter correct email ID")
    return false;
}

آخر يمكنك استخدامه مسج.تحدد القواعد الداخلية:

eMailId: {
    required: true,
    email: true
}

تحديث ريجكس 2018!جرب هذا

let val = 'email@domain.com';
if(/^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val)) {
   console.log('passed');
}

النسخة المطبوعة كاملة

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.]+@([a-z]|[a-z0-9]?[a-z0-9-]+[a-z0-9])\.[a-z0-9]{2,10}(?:\.[a-z]{2,10})?$/.test(val);

مزيد من المعلومات https://git.io/vhEfc

أفضل تعبير عادي على الإطلاق يتوافق مع RFC5322

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])+

الحل الذي لا يتحقق من وجود TLD هو حل غير كامل.

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

1- التحقق من تنسيق البريد الإلكتروني: التأكد مما إذا كان البريد الإلكتروني يتوافق مع تنسيق ونمط رسائل البريد الإلكتروني في RFC 5322 وما إذا كان TLD موجودًا بالفعل.يمكن العثور على قائمة بجميع نطاقات TLD الصالحة هنا.

على سبيل المثال، على الرغم من أن العنوان example@example.ccc سوف يمرر التعبير العادي، فهو ليس بريدًا إلكترونيًا صالحًا، لأنه ccc ليس نطاق المستوى الأعلى بواسطة IANA.

2- التأكد من وجود البريد الإلكتروني بالفعل: للقيام بذلك، الخيار الوحيد يكون لإرسال بريد إلكتروني للمستخدمين.

على ما يبدو، هذا كل شيء:

/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i

مأخوذ من http://fightingforalostcause.net/misc/2006/compare-email-regex.php في 1 أكتوبر 2010.

ولكن، بطبيعة الحال، هذا يتجاهل التدويل.

أضع ثقتي في squirtle, ، إليك حل معقد، لكنه يقوم بعمل جيد جدًا في التحقق من صحة رسائل البريد الإلكتروني بشكل صحيح:

function isEmail(email) { 
    return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(email);
} 

استخدم مثل هذا:

if (isEmail('youremail@yourdomain.com')){ console.log('This is email is valid'); }

فيما يلي مناقشة جيدة جدًا حول استخدام التعبيرات العادية للتحقق من صحة عناوين البريد الإلكتروني؛"مقارنة عنوان البريد الإلكتروني والتحقق من صحة التعبيرات العادية"

فيما يلي التعبير العلوي الحالي، المتوافق مع JavaScript، للأغراض المرجعية:

/^[-a-z0-9~!$%^&*_=+}{\'?]+(\.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(\.[-a-z0-9_]+)*\.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,5})?$/i

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

الأخطاء الأكثر شيوعًا التي واجهتني هي المسافات (خاصة في البداية والنهاية) وأحيانًا النقطة المزدوجة.

function check_email(val){
    if(!val.match(/\S+@\S+\.\S+/)){ // Jaymon's / Squirtle's solution
        // Do something
        return false;
    }
    if( val.indexOf(' ')!=-1 || val.indexOf('..')!=-1){
        // Do something
        return false;
    }
    return true;
}

check_email('check@thiscom'); // Returns false
check_email('check@this..com'); // Returns false
check_email(' check@this.com'); // Returns false
check_email('check@this.com'); // Returns true
<form name="validation" onSubmit="return checkbae()">
    Please input a valid email address:<br />

    <input type="text" size=18 name="emailcheck">
    <input type="submit" value="Submit">
</form>

<script language="JavaScript1.2">
    var testresults
    function checkemail(){
        var str = document.validation.emailcheck.value
        var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
        if (filter.test(str))
            testresults = true
        else {
            alert("Please input a valid email address!")
            testresults = false
        }
        return (testresults)
    }
</script>

<script>
    function checkbae(){
        if (document.layers || document.getElementById || document.all)
            return checkemail()
        else
            return true
    }
</script>

التعبير العادي الذي توفره Microsoft داخل ASP.NET MVC يكون

/^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$/

والذي أنشره هنا في حالة وجود خلل - على الرغم من أنه كان دائمًا مثاليًا لاحتياجاتي.

بناء جملة البريد القياسي في ويكيبيديا:

https://en.wikipedia.org/wiki/Email_address#Examples https://fr.wikipedia.org/wiki/Adresse_%C3%A9lectronique#Syntaxe_exacte

function validMail(mail)
{
    return /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()\.,;\s@\"]+\.{0,1})+([^<>()\.,;:\s@\"]{2,}|[\d\.]+))$/.test(mail);
}

// VALID MAILS

validMail('Abc@example.com') // Return true
validMail('Abc@example.com.') // Return true
validMail('Abc@10.42.0.1') // Return true
validMail('user@localserver') // Return true
validMail('Abc.123@example.com') // Return true
validMail('user+mailbox/department=shipping@example.com') // Return true
validMail('"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com') // Return true
validMail('!#$%&\'*+-/=?^_`.{|}~@example.com') // Return true
validMail('"()<>[]:,;@\\\"!#$%&\'-/=?^_`{}| ~.a"@example.org') // Return true
validMail('"Abc@def"@example.com') // Return true
validMail('"Fred Bloggs"@example.com') // Return true
validMail('"Joe.\\Blow"@example.com') // Return true
validMail('Loïc.Accentué@voilà.fr') // Return true
validMail('" "@example.org') // Return true
validMail('user@[IPv6:2001:DB8::1]') // Return true

// INVALID MAILS

validMail('Abc.example.com') // Return false
validMail('A@b@c@example.com') // Return false
validMail('a"b(c)d,e:f;g<h>i[j\k]l@example.com') // Return false
validMail('just"not"right@example.com') // Return false
validMail('this is"not\allowed@example.com') // Return false
validMail('this\ still\"not\\allowed@example.com') // Return false
validMail('john..doe@example.com') // Return false
validMail('john.doe@example..com') // Return false

أظهر هذا الاختبار: https://regex101.com/r/LHJ9gU/1

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top