javascript - w3schools - regular expression email c#




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

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

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

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

على سبيل المثال ، على الرغم من أن العنوان [email protected]سيؤدي إلى تمرير regex ، إلا أنه ليس بريدًا إلكترونيًا صالحًا ، نظرًا لأن cccIANA ليس نطاقًا عالي المستوى.

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

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


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

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

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


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

email.indexOf("@") > 0

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

لاختبار ذلك ، أرسل رسالة تحقق.


سرقت هذه من 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;}

لا يعد التحقق الصحيح من عنوان البريد الإلكتروني بما يتوافق مع RFC شيئًا يمكن تحقيقه باستخدام تعبير عادي منتظم. مقال يحتوي على أفضل حل وجدته في PHP هو ما هو عنوان بريد إلكتروني صالح؟ . من الواضح أنه تم نقله إلى جافا. أعتقد أن الوظيفة معقدة للغاية بحيث لا يمكن نقلها واستخدامها في 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 : يجب أن يكون Last @ قبل الأخير . لأن @ لا يمكن أن يكون جزء من اسم الخادم (بقدر ما أعرف).

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

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

  • lastDotPos > 2 : يجب أن يكون هناك ثلاثة أحرف على الأقل قبل النقطة الأخيرة ، على سبيل المثال [email protected] .

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


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

[email protected]

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

/\[email protected]\S+\.\S+/

مثال على وظيفة JavaScript:

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

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

يعرف المعيار الرسمي بـ RFC 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])?

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

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

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

التركيز لي


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

<input type="email"/>

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


هذا هو إصدار 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);
}

هذه هي الطريقة node-validator تقوم بها node-validator :

/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~][email protected](?:(?:(?:[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])\]))$/

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

\[email protected]\S+

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


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

الآن نظرًا لأنه يمكنك تغطية 90٪ من الحالات فقط ، اكتب شيئًا مثل:

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

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

العالم بحاجة إلى رمز أبسط ...


يمكن أن تطابق جافا سكريبت تعبيرًا عاديًا:

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)>)$

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

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

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

// VALID MAILS

validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('[email protected]') // Return true
validMail('user+mailbox/[email protected]') // Return true
validMail('"very.(),:;<>[]\".VERY.\"[email protected]\\ \"very\".unusual"@strange.example.com') // Return true
validMail('!#$%&\'*+-/=?^_`.{|}[email protected]') // Return true
validMail('"()<>[]:,;@\\\"!#$%&\'-/=?^_`{}| ~.a"@example.org') // Return true
validMail('"[email protected]"@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('[email protected][IPv6:2001:DB8::1]') // Return true

// INVALID MAILS

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

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


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

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

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

eMailId: {
    required: true,
    email: true
}

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

/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~][email protected]((((([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.

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


التعبير العادي الذي توفره 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})?$/

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


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

let val = '[email protected]';
if(/^[a-z0-9][a-z0-9-_\.][email protected]([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');
}

نسخة typscript كاملة

//
export const emailValid = (val:string):boolean => /^[a-z0-9][a-z0-9-_\.][email protected]([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


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

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

function check_email(val){
    if(!val.match(/\[email protected]\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('[email protected]'); // Returns false
check_email('[email protected]'); // Returns false
check_email(' [email protected]'); // Returns false
check_email('[email protected]'); // Returns true

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

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

بدلاً من جديد RegExp، فقط جرّب كتابة regexpمثل هذا:

if (reg.test(/@/))

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







email-validation