একটি নিয়মিত এক্সপ্রেশন ব্যবহার করে কোনও ইমেল ঠিকানা বৈধতা কিভাবে?


3309

কয়েক বছর ধরে আমি আস্তে আস্তে বিকাশ করেছি একটি নিয়মিত ভাব প্রকাশ করেছি যা বেশিরভাগ ইমেল ঠিকানাগুলিকে সঠিকভাবে বৈধ করে, ধরে নিয়ে যে তারা সার্ভার অংশ হিসাবে কোনও আইপি ঠিকানা ব্যবহার করে না।

আমি এটি বেশ কয়েকটি পিএইচপি প্রোগ্রামগুলিতে ব্যবহার করি এবং এটি বেশিরভাগ সময় কাজ করে। তবে, সময়ে সময়ে আমি এমন কোনও ব্যক্তির সাথে যোগাযোগ করি যেটি এটি ব্যবহার করে এমন একটি সাইটের সাথে সমস্যা হচ্ছে এবং আমি কিছুটা সামঞ্জস্য করতে পেরেছি (অতি সম্প্রতি আমি বুঝতে পেরেছি যে আমি 4-চরিত্রের টিএলডি অনুমতি দিচ্ছি না)।

ইমেলগুলি যাচাই করার জন্য আপনি যে সেরা নিয়মিত প্রকাশ পেয়েছেন বা দেখেছেন তা কী?

আমি বেশ কয়েকটি সমাধান দেখেছি যা বিভিন্ন সংক্ষিপ্ত এক্সপ্রেশন ব্যবহার করে এমন ফাংশন ব্যবহার করে তবে আমি আরও জটিল ফাংশনে কয়েকটি সংক্ষিপ্ত প্রকাশের পরিবর্তে একটি সাধারণ ফাংশনে একটি দীর্ঘ জটিল ভাব প্রকাশ করি।



5
যে আইডিএনএ সঠিকভাবে ফর্ম্যাট করা হয়েছে তা যাচাই করতে পারে এমন রেজেক্স স্ট্যাকেক্সচেঞ্জের সাথে খাপ খায় না। (ক্যানোনিকালাইজেশনের নিয়মগুলি সত্যই মারাত্মক এবং বিশেষত রেজেক্স প্রসেসিংয়ের পক্ষে অসুস্থ নয়)
জেসেন


কিছু ক্ষেত্রে যেমন রেজিক্সগুলি পরিবর্তনশীল হতে পারে , একটি ইমেল কনতে একটি স্থান থাকতে পারে এবং অন্য সময়ে এটি কোনও স্থান রাখতে পারে না।
21gǻňạcểơửṩ

উত্তর:


2437

সম্পূর্ণরূপে বোঝায় যা RFC 822 অনুবর্তী Regex অদক্ষ এবং তার দৈর্ঘ্য কারণ অস্পষ্ট। সৌভাগ্যক্রমে, আরএফসি 822 দুইবার বাদ দেওয়া হয়েছিল এবং ইমেল ঠিকানার জন্য বর্তমান স্পেসিফিকেশনটি আরএফসি 5322 । আরএফসি 5322 একটি রেজেক্সের দিকে নিয়ে যায় যা কয়েক মিনিটের জন্য অধ্যয়ন করা হলে বোঝা যায় এবং প্রকৃত ব্যবহারের জন্য যথেষ্ট দক্ষ।

একটি আরএফসি 5322 কমপ্লিয়েন্ট রেইজেক্স পৃষ্ঠার শীর্ষে http://emailregex.com/ এ পাওয়া যাবে তবে আইপি অ্যাড্রেস প্যাটার্নটি ব্যবহার করে যা একটি বাগ দিয়ে ইন্টারনেটের চারপাশে ভাসমান 00যা একটিতে স্বাক্ষরবিহীন বাইট দশমিক মানগুলির জন্য মঞ্জুরি দেয় বিন্দু-সীমাবদ্ধ ঠিকানা, যা অবৈধ। এটির বাকিগুলি আরএফসি 5322 ব্যাকরণের সাথে সামঞ্জস্যপূর্ণ বলে মনে হয় এবং grep -Poডোমেনের নাম, আইপি ঠিকানা, খারাপ ঠিকানা এবং অ্যাকাউন্টের নাম এবং নিবন্ধ ছাড়াও কয়েকটি পরীক্ষায় পাস করে ।

00আইপি প্যাটার্নে বাগটি সংশোধন করে আমরা একটি কার্যকরী এবং মোটামুটি দ্রুত রেজেক্সটি পাই। (প্রকৃত কোডের জন্য মার্কডাউন নয়, রেন্ডার করা সংস্করণটি স্ক্র্যাপ করুন)

(: [একটি z0-9 # $% & '* + + / = ^: _' {|} ~ - + + (?।: \ [একটি-z0-9 # $% &!] '? * + + / ? = ^: _ '{|} ~ -]) * | "(: [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21 \ x23- \ x5b \ x5d- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) * ") @ (: (: [একটি z0-9] (:? [একটি-z0-9 -] * [একটি z0 -9]) \) [একটি z0-9] (:।??? [একটি z0-9 -] * [একটি z0-9]) | \ [(:( :( 2 (5 [0-5] | [0-4] [0-9]) | 1 [0-9] [0-9] |?। [1-9] [0-9])) \) {3} ( ? :( 2 (5 [0-5] | [0-4] [0-9]) | 1 [0-9] [0-9] | [1-9] [0-9]) |? [ একটি z0-9 -] * [একটি z0-9]: (: [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ x5a \ x53- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) + +) \])

বা:

(?:[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])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-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])+)\])

উপরের রেজিএক্সপেক্সের জন্য এখানে সীমাবদ্ধ রাষ্ট্রীয় মেশিনের ডায়াগ্রাম রয়েছে যা নিজেই রেজিএক্সপ্যাকের চেয়ে বেশি স্পষ্ট enter image description here

পার্ল এবং পিসিআরইতে আরও পরিশীলিত নিদর্শনগুলি (পিএইচপি-তে ব্যবহৃত রেজেক্স লাইব্রেরি) কোনও বাধা ছাড়াই আরএফসি 5322 কে সঠিকভাবে পার্স করতে পারে । পাইথন এবং সি # এটিও করতে পারে তবে তারা প্রথম দুটি থেকে আলাদা সিনট্যাক্স ব্যবহার করে। তবে, যদি আপনি অনেক কম শক্তিশালী প্যাটার্ন-ম্যাচিং ভাষার মধ্যে একটি ব্যবহার করতে বাধ্য হন তবে সত্যিকারের পার্সার ব্যবহার করা ভাল।

এটি আরএসএফসি অনুসারে এটি বৈধকরণও আপনাকে সেই ঠিকানাটি সরবরাহিত ডোমেনে আসলে উপস্থিত রয়েছে কিনা, বা ঠিকানায় প্রবেশকারী ব্যক্তি তার সত্যিকারের মালিক কিনা সে সম্পর্কে একেবারে কিছুই বলে না তা বোঝার বিষয়টিও গুরুত্বপূর্ণ important লোকেরা মেলিং তালিকাগুলিতে অন্য সময় সাইন আপ করে। ফিক্সিংয়ের জন্য একটি ফ্যানসিয়ার ধরণের বৈধতা প্রয়োজন যা ঠিকানাকে একই ওয়েব পৃষ্ঠায় প্রবেশের অনুরোধ হিসাবে নিশ্চিতকরণ টোকেন সহ একটি বার্তা প্রেরণ জড়িত।

নিশ্চিতকরণ টোকেনগুলি হ'ল এটি জানার একমাত্র উপায় আপনি যে ব্যক্তিতে প্রবেশ করছেন তার ঠিকানা পেয়েছেন। এ কারণেই বেশিরভাগ মেলিং তালিকাগুলি সাইন-আপগুলি নিশ্চিত করার জন্য সেই প্রক্রিয়াটি ব্যবহার করে। সর্বোপরি, যে কোনও ব্যক্তি নীচে নামতে পারেন president@whitehouse.gov, এবং এটি আইনী হিসাবেও বিশ্লেষণ করবে, তবে অন্য প্রান্তে ব্যক্তি হওয়ার সম্ভাবনা নেই।

পিএইচপি-র জন্য, আপনার পিএইচপি -র সাথে একটি ইমেল ঠিকানা বৈধ করুন, যে সঠিক পথ থেকে আমি উদ্ধৃত করছি তাতে প্রদত্ত প্যাটার্নটি ব্যবহার করা উচিত নয় :

কিছুটা বিপদ রয়েছে যে সাধারণ ব্যবহার এবং ব্যাপকভাবে opালু কোডিং ইমেল ঠিকানাগুলির জন্য একটি ডি ফ্যাক্টো স্ট্যান্ডার্ড প্রতিষ্ঠা করবে যা রেকর্ডকৃত আনুষ্ঠানিক মানের চেয়ে আরও সীমিত।

এটি অন্য সমস্ত আরএফসি-র নিদর্শনগুলির চেয়ে ভাল নয়। এমনকি আরএফসি 822 পরিচালনা করতেও এটি যথেষ্ট স্মার্ট নয় , আরএফসি 5322 কে ছেড়ে দিন This এটি অবশ্য is

যদি আপনি অভিনব এবং পেডেন্টিক পেতে চান তবে একটি সম্পূর্ণ রাষ্ট্র ইঞ্জিন প্রয়োগ করুন । একটি নিয়মিত অভিব্যক্তি কেবলমাত্র একটি প্রাথমিক শোধক হিসাবে কাজ করতে পারে। নিয়মিত প্রকাশের সাথে সমস্যাটি হ'ল কাউকে বলা যে তাদের পুরোপুরি বৈধ ইমেল ঠিকানাটি অবৈধ (একটি মিথ্যা পজিটিভ) কারণ আপনার নিয়মিত প্রকাশটি এটি পরিচালনা করতে পারে না এটি কেবল অভদ্র এবং ব্যবহারকারীর দৃষ্টিকোণ থেকে অসম্পূর্ণ। এই উদ্দেশ্যে ইঞ্জিন কোনও রাজ্য ইঞ্জিন উভয়ই ইমেল ঠিকানাগুলিকে বৈধতা দিতে পারে এমনকি সঠিকও করতে পারে যা অন্য কোনও আরএফসি অনুসারে ই-মেইল ঠিকানাকে বিচ্ছিন্ন করার কারণে এটি অবৈধ বলে বিবেচিত হবে। এটি একটি সম্ভাব্য আরও আনন্দদায়ক অভিজ্ঞতা, যেমন পছন্দ করে

নির্দিষ্ট ই-মেইল ঠিকানা 'মাইমেল @ ঠিকানা, কম' অবৈধ। আপনার অর্থ 'myemail@address.com' ছিল?

মন্তব্য সহ ইমেল ঠিকানা বৈধকরণও দেখুন । বা নিয়মিত এক্সপ্রেশন বৈধকরণ ইমেইল ঠিকানার তুলনা

Regular expression visualization

ডিবাগেক্স ডেমো


179
আপনি বলেছিলেন "কোনও ভাল নিয়মিত প্রকাশ নেই" " এই সাধারণ বা ইমেল ঠিকানা বৈধতা নির্দিষ্ট?
তোমালাক

37
@ তোমালাক: কেবল ইমেল ঠিকানাগুলির জন্য। যেমন বোর্টজমায়ার বলেছেন, আরএফসি চূড়ান্ত জটিল
লুক

37
আপনি যে লিনাক্স জার্নাল নিবন্ধটি উল্লেখ করেছেন সেটি বেশ কয়েকটি ক্ষেত্রে সত্যই ভুল। বিশেষত লাভল স্পষ্টভাবে আরএফসি3696 এ ত্রুটিটি পড়েনি এবং আরএফসির প্রকাশিত সংস্করণে কিছু ত্রুটি পুনরাবৃত্তি করেছে। আরও এখানে: dominicsayers.com/isemail
ডমিনিক সায়ার

9
সমস্ত বৈধ ইমেল ঠিকানাগুলি যাচাই করার জন্য জেফ অ্যাটউডের এই ব্লগ পোস্টটিতে একটি সুদৃ
re়

5
নোট করুন যে বর্তমান এইচটিএমএল 5 স্পেসে ইমেল-টাইপ ইনপুট বৈধকরণের জন্য একটি রেইজেক্স এবং এবিএনএফ অন্তর্ভুক্ত রয়েছে যা মূল আরএফসিগুলির চেয়ে ইচ্ছাকৃতভাবে আরও বাধাজনক।
সিঙ্ক্রো

745

ইমেল ঠিকানাগুলি যাচাই করার জন্য আপনার নিয়মিত অভিব্যক্তি ব্যবহার করা উচিত নয়।

পরিবর্তে, মেলএড্রেস ক্লাসটি ব্যবহার করুন :

try {
    address = new MailAddress(address).Address;
} catch(FormatException) {
    // address is invalid
}

MailAddressবর্গ RFC822 সঙ্গে পূর্ণ অনুযায়ী ঠিকানা যাচাই করার জন্য একটি বিএনএফ পার্সার ব্যবহার করে।

আপনি যদি MailAddressই-মেইল ঠিকানাটি বৈধ করার জন্য ব্যবহার করার পরিকল্পনা করেন তবে সচেতন হন যে এই পদ্ধতির সাথে ই-মেইল ঠিকানার ডিসপ্লে নামের অংশটিও গ্রহণ করা হয়েছে এবং আপনি যা অর্জন করতে চান তা ঠিক তা নাও হতে পারে। উদাহরণস্বরূপ, এটি এই স্ট্রিংগুলিকে বৈধ ইমেল ঠিকানা হিসাবে গ্রহণ করে:

  • "user1@hotmail.com; user2@gmail.com"
  • "user1@hotmail.com; user2@gmail.com; user3@company.com"
  • "ব্যবহারকারী প্রদর্শনের নাম user3@company.com"
  • "user4 @ Company.com"

এর মধ্যে কয়েকটি ক্ষেত্রে কেবল স্ট্রিংয়ের শেষ অংশটি ঠিকানা হিসাবে বিভক্ত করা হয়; তার আগে বাকিটি প্রদর্শন নাম। কোনও প্রদর্শনীর নাম ছাড়াই একটি সরল ই-মেইল ঠিকানা পেতে, আপনি নিজের মূল স্ট্রিংয়ের বিপরীতে স্বাভাবিক ঠিকানাটি চেক করতে পারেন।

bool isValid = false;

try
{
    MailAddress address = new MailAddress(emailAddress);
    isValid = (address.Address == emailAddress);
    // or
    // isValid = string.IsNullOrEmpty(address.DisplayName);
}
catch (FormatException)
{
    // address is invalid
}

তদ্ব্যতীত, শেষে একটি user@company.বিন্দুযুক্ত একটি ঠিকানা যেমন মেলএড্রেসস দ্বারা গৃহীত হয়।

আপনি যদি সত্যিই একটি রেজেেক্স ব্যবহার করতে চান তবে এটি এখানে :

(?: (?: \ r \ n)? [\ t]) * (?: (?: (?: ([: ^ ()) <> @,;: \\ "। \ [\] \ 000- \ 031 ] + (?: (?: (?: (?: \ r \ n))? [\ t]
(? = [\ [) + + | | \ টু Z "() <> @;: \\" \ [\]])) | "(: [^ \?" \ দ \\] | \\।। | (?: (?: (?: \ r \ n)? [\ t]))) * "(? :( ?:
\ r \ n)? [\ t]) *) (?: \। (?: (?: (: r \ n))? [\ t]) * (?: [^ () <> @,;: \ \ "। \ [\] \ 000- \ 031] + (? :(? :(
?: \ r \ n)? [\ t]) + | \ Z | (? = [\ ["() <> @);: \\"। \ [\]])) | "(?: [ ^ \ "\ দ \\] | \\ | (।? (: \ R \ N) [? 
\ t])) * "(?: ((?: \ r \ n)? [\ t]) *)) * @ ((?: (?: \ r \ n)? [\ t]) * (?:? [^ () <> @,;: \\ "। \ [\] \ 000- \ 0
31] + (?: (?: (?: (?: \ R \ n))? [\ T]) + | \ জেড | (?? [[\ ["() <> @,;: \\"। \ [\ ]])) | \ [([^ \ [\] \ দ \\] |। \\) * \
] (?: ((?: \ r \ n)? [\ t]) *) (?: \। (?? (?: (?: \ r \ n))? [\ t]) * (?: [^ ()) <> @,;: \\ "। \ [\] \ 000- \ 031] +
(?: (?? ((?: (?: \ r \ n))? [\ টি]) + | \ জেড | (?? [[(["() <> @,;: \\"। \ [\]])) ) | \ [([^ \ [\] \ দ \\] | \\) * \।] (?:
(?: \ r \ n)? [\ t]) *)) * | ((?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?: (?? \ r \ n)? [\ t]) + | \ জেড
| (? = [\ [ "() <> @;: \\"। \ [\]])।?) | "? (: [^ \" \ দ \\] | \\ | (:( ?: \ r \ n)? [\ t])) * "(?: (?: \ r \ n)
? [\ t]) *) * \ <(?: (?: \ r \ n)? [\ t]) * (?: @ (?: [^ () <> @,;: \\ ")।" \ [\] \ 000- \ 031] + (?: (?? (?? \
r \ n)? [\ t]) + | \ Z | (? = [\ ["() <> @,;: \\"। \ [\]])) | \ [([^ \ [\ ] \ দ \\] | \\) * \]। (: (: \ R \ N)? [
 \ টি]) *) (?: \। (?? ((?: \ r \ n)?? [\ t])) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] (: (: (: \ R \ N)
? [\ t]) + | \ জেড | (? = [\ ["() <> @,;: \\"। \ [\]])) | \ [([^ \ [\] \ আর \ \] | \\।) * \] (?: (?? (: r \ n))? [\ t]
) *)) * (?:, @ (?: (?: (: r \ n))? [\ টি]) * (?: [[^ () <> @,;: \\ "। \ [\] \ 000- \ 031] (: (: (: \ R \ N) [
 \ T]) + + | \ টু Z | (=? [\ [ "() <> @;: \\"। \ [\]])) | \ [([^ \ [\] \ দ \\] | \\।) * \] (?: ((?: \ r \ n)? [\ t])) *
) (?: \। (?: (?: (: r \ n))? [\ t]) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031 ] + (?: (?: (?: (?: \ r \ n))? [\ t]
) + + | \ টু Z | (= [\ [? "() <> @;: \\"। \ [\]])) | \ [([^ \ [\] \ দ \\] | \\ ।) * \] (?: (?: (: r \ n)? [\ t]) *)) *)
*: (?: (?: (?: \ r \ n)? [\ t]) *)? (?: ([^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?: (?: (: r \ n))? [\ t]) +
| \ টু Z | (= [\ [ "() <> @;: \\"?। \ [\]])।) | "? (: [^ \" \ দ \\] | \\ | ( ?: (?: \ r \ n)? [\ t])) * "(?: (?? \ r
\ n)? [\ t]) *) (?: \। (?: (?: (: r \ n))? [\ t]) * (?: [^ () <> @,;: \\ " । \ [\] \ 000- \ 031] + (? :(? :( ?:
\ r \ n)? [\ t]) + | \ জেড | (? = [\ ["() <> @,;: \\"। \ [\]])) | ""?? ([^ \ "\ r \\] | \\। | (?: (?? (: r \ n))? [\ t
])) * "(?: ((?: \ r \ n)? [\ t]) *)) * @ (?: ((?: \ r \ n)? [\ টি])) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031
] + (?: (?: (?: (?: \ আর \ এন)?? [\ টি])) + | \ জেড | (?? [[\ ["() <> @,;: \\"। \ [\] ])) | \ [([^ \ [\] \ দ \\] |। \\) * \] (
?: (?: \ r \ n)? [\ t]) *) (?: \। (?: ((?: \ r \ n))? [\ t]) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?
: (?: (?: (?: \ r \ n)? [\ t]) + | \ জেড | (? = [\ ["() <> @,;: \\"। \ [\]]))) | \ [([^ \ [\] \ দ \\] |। \\) * \]? (:(?
: \ r \ n)? [\ t]) *)) * \> (?: ((?: \ r \ n)? [\ t]) *) | (?: [^ () <> @ ,; : \\ "। \ [\] \ 000- \ 031] + (? :(?
: (?: \ r \ n)? [\ t]) + | \ জেড | (? = [\ ["()) <> @,;: \\"। \ [\]])) | "(?? : [^ \ "\ দ \\] | \\ | (।? (: \ R \ N)?
[\ t])) * "(?: ((?: \ r \ n)? [\ t]) *) *) *: ((?: (?: \ r \ n)? [\ t]) * (?: ? (: (: [^ () <> @;। \\ "\ [\] 
\ 000- \ 031] + (?: ((?: (?? \ R \ n)?? [\ T])) + | \ জেড | (? = [\ ["()) <> @,;: \\" । \ [\]])) | "(: [^ \" \ দ \\] |
\\। ((?: (?: (?: \ r \ n)? [\ t]))) * "(?: ((?: \ r \ n)? [\ t]) *) (?:?। (?? : ((?: \ r \ n)? [\ t]) * (?: [^ () <>

@,;: \\ "। \ [\] \ 000- \ 031] + (?: (?? (?: (?: \ R \ n))? [\ T]) + | \ জেড | (? = [\ [ "() <> @;: \\"। \ [\]])) | "
(?: [^ \ "\ r \\] | \\। | (?: ((?: \ r \ n)?? [\ t]))))" "(?: (?:? r \ n)? [ \ টি]) *)) * @ (?: (?: (: r \ n))? [\ t]
) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + + | \ টু Z | (= [\ [ "() <> @;: \\
"। \ [\]])) | \ [([[^ \ [\] \ আর \\] | \\।) * \] (?: (?: \ r \ n)? [\ t]) * ) (?: \। (?: (?: (: r \ n))? [\ t]) * (?
: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + | \ Z । | (= [\ [ "() <> @;: \\" \ [
\]])) | \ [([[^ \ [\] \ আর \\] | \\।) * \] (?: (?: \ r \ n)? [\ টি]) *)) * | (?: [^ () <> @,;: \\ "। \ [\] \ 000-
\ 031] + (?: (?: (?: (: R \ n))? [\ T]) + | \ জেড | (? = [\ ["() <> @,;: \\"। \ [ \]])) | "(: [^ \?" \ দ \\] | \\ | (।
?: (?: \ r \ n)? [\ t])) * "(?: ((?: \ r \ n)? [\ t]) *) * \ <(?: (?: \ r \ n)? [\ t]) * (?: @ (?: [^ () <> @ ,;
: \\ "। \ [\] \ 000- \ 031] + (?: ((?: (?: (?: \ R \ n))? [\ টি]) + | \ জেড | (? = [\ [" ()) । <> @;: \\ "\ [\]])) | \ [([
^ \ [\] \ আর \\] | \\।) * \] (?: ((?: (: r \ n))? [\ টি]) *) (?: \। (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ "
। \ [\] \ 000- \ 031] + (?: (?: (?: (: R \ n))? [\ টি]) + | \ জেড | (? = [\ ["() <> @, @ ;:। \\ "\ [\]])) | \ [([^ \ [\
] \ r \\] | \\।) * \] (?: ((?: \ r \ n)? [\ t]) *)) * (?:, @ (?: (?: \ r \ n )? [\ t]) * (?: [^ () <> @,;: \\ "।
[\] \ 000- \ 031] + (?: ((?: (?: \ R \ n))? [\ টি]) + | \ জেড | (? = ["[" () <> @,;;: \\ "\ [\]])) |। \ [([^ \ [\] \
r \\] | \\।) * \] (?: ((?: \ r \ n)? [\ t])) *) (?: \। (?: (?: \ r \ n)? [\ T]) *: [<> @ (^ (।: \\ "\ [\?)] 
\ 000- \ 031] + (?: ((?: (?? \ R \ n)?? [\ T])) + | \ জেড | (? = [\ ["()) <> @,;: \\" । \ [\]])) | \ [([^ \ [\] \ দ \\]
| \\।) * \] (?: ((?: \ r \ n)? [\ t]) *)) *) *) *: (?: (?: \ r \ n)? [\ t]) * )? (?: [^ () <> @,;: \\ "। \ [\] \ 0
00- \ 031] + (?: (?: (?: (?: \ R \ n))? [\ T]) + | \ জেড | (? = [\ ["() <> @,;: \\")। \ [\]])) | "(: [^ \" \ দ \\] | \\
। | (?: (?: (?: \ r \ n)? [\ t]))) * "(?: ((?: (: r \ n))? [] t]) *) (?: \। (? :( ?: \ r \ n)? [\ t]) * (?: [^ () <> @,
;: \\ "। \ [\] \ 000- \ 031] + (?: ((?: (?: (: R: \ n))? [\ টি]) + + \ জেড | (? = [\ [" ( ) <> @;: "। \ [\]])) |" \\ (?
: [^ \ "\ আর \\] | \\। | ((?: (?: \ r \ n)? [\ টি]))) *" (?: (?: \ r \ n)? [\ t ]) *)) * @ (?: ((?: \ r \ n)? [\ t])) *
(?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?? ((?: \ R \ n))? [\ টি]) + | \ টু Z | (= [\ [ "() <> @;: \\"।
\ [\]])) \ [([[^ \ [\] \ আর \\] | \\।) * \] (?: (?: \ r \ n)? [\ টি]) *) () ?: \। (?: (?: (?: \ r \ n))? [\ t]) * (?: [
^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?? (?: \ 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 \ n)? [\ t])) * "(?: (?? (: r \ n))? [\ t
]) *)) * @ (?: ((?: \ r \ n)? [\ t]) * (?: [[^ () <> @,;: \\ "। \ [\] \ 000- 031] + (?: (?: (?: (?: \ R \ n))? [\ T
]) + + | \ টু Z | (=? [\ [ "() <> @;: \\"। \ [\]])) | \ [([^ \ [\] \ দ \\] | \ \।) * \] (?: ((?: \ r \ n)? [\ t]) *) (?
: \। (?: (?: (?: \ r \ n)? [\ t])) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + ( ?: (?: (?: (: r \ n))? [\ t]) + |
\ টু Z | (= [\ [ "() <> @;: \\"?। \ [\]])।) | \ [([^ \ [\] \ দ \\] | \\) * \] (?: (?: (?: \ r \ n)? [\ t]) *)) * | ((?:
[^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?? (?: \ R \ n)? [\ টি]) + | \ জেড | ? (= [\ [ "() <> @;: \\"। \ [\
]])) | "" (?: [^ \ "\ আর \\] | | \\। | (?: (?: (: r \ n))? [\ t]))) *" (?: (??: \ r \ n)? [\ t]) *) * \ <(?: (?: \ r \ n)
? [\ t]) * (?: @ (?: [^ ()) <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n)? [\ t]) + | \ জেড | (? = [\ ["
() <> @;।।? \\ "\ [\]])) | \ [([^ \ [\] \ দ \\] | \\) * \] (: (: \ R \ n)? [\ t]) *) (?: \। (?: (?: (: r \ n))
? [\ t]) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n))? [\ t]) + | \ জেড | (? = [\ ["() <>)

@;।।? \\ "\ [\]])) | \ [([^ \ [\] \ দ \\] | \\) * \] (: (: \ R \ N)? [\ t]) *)) * (?:, @ (?: (?: \ r \ n)? [
 \ টি]) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n))? [\ T]) + + | \ টু Z | (? = [\ [ "() <> @,
;: \\ "। \ [\]]) | \ [([[^ \ [\] \ আর \\] | \\।) * *] (?: (?: \ r \ n)? [\ t]) *) (?: \। (?: (?: (: r \ n))? [\ t]
) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?: (?: \ R \ n)? [\ T]) + + | \ টু Z | (= [\ [ "() <> @;: \\
"। \ [\]])) | \ [([[^ \ [\] \ আর \\] | \\।) * \] (?: (?: \ r \ n)? [\ t]) * )) *) *: (?: ((?: \ r \ n)? [\ t]) *)?
(?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?? ((?: \ R \ n))? [\ টি]) + | \ টু Z | (= [\ [ "() <> @;: \\"।
\ [\]])) "" (?: [^ \ "\ আর \\] | | \\। | |? (?: (?: \ আর \ এন)?? [\ টি]))))" "(? :( ?: \ r \ n)? [\ t]) *) (?: \। (? :( ?:
\ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?: (?: \ r \ n)? [\ t]) + | \ জেড | (? = [\ [
"() <> @;: \\" \ [\]])) | "(: [^ \?" \ দ \\] | \\ | (: (: \ R \ N।??)। ? [\ t])) * "(?: ((?: \ r \ n)? [\ t])
*)) * @ (?: (?: (?: \ r \ n)? [\ t])) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?: (?: (?: \ r \ n))? [\ t])
+ + | \ টু Z | (= [\ [ "() <> @;: \\" \ [\]]।)) | \ [([^ \ [\] \ দ \\] | \\। ) * \] (?: ((?: \ r \ n)? [\ t]) *) (?: \
। (?: (?: \ r \ n)? [\ t]) * (?: [^ () <> @,;: \\ "। \ [\] \ 000- \ 031] + (?: (?: (?? \ r \ n)? [\ t]) + | \ জেড
| (? = [\ [ "() <> @;: \\"। \ [\]])।) | \ [([^ \ [\] \ দ \\] | \\) * \] (?: (?? (: r \ n)? [\ t]) *)) * \> (? :(
?: \ r \ n)? [\ t]) *)) *)?; \ s *)

26
আপনি দেখতে পাবেন যে .NET 4.0 এ মেল অ্যাড্রেস ক্লাস পূর্ববর্তী সংস্করণগুলির তুলনায় ইমেল ঠিকানাগুলি যাচাইকরণের চেয়ে অনেক ভাল। আমি এতে কিছু উল্লেখযোগ্য উন্নতি করেছি।
জেফ টাকার

7
আমি মনে করি এটি সহজ আইডির জন্য ... এইভাবে কাজ করে না ... একটি @ বি বৈধতা দেয় না। ar@b.com কেবল আর @ বি পর্যন্ত মিলছে, .কমটি মেলে না। তবে, "আমি আমি" @ [10.10.10.10] এর মতো কিছু কাজ করে! :)
রাজে

5
সতর্কতা অবলম্বন করুন যে এই আরএফসি সম্মতিসূচক রেজেক্স বৈধকারকরা প্রচুর ইমেল ঠিকানা দিয়ে দেবেন যা আপনি সম্ভবত "এ <বডি / অনলোড = সতর্কতা (' lol.com?'+docament.cookies ) @aa> হিসাবে গ্রহণ করতে চান না "যা পার্লের
ম্যাথিউ লক

9
@ ম্যাথেললক: এর চেয়ে খারাপ আর কিছু নয় fake@not-a-real-domain.name। এক্সএসএস রোধ করতে আপনার অবশ্যই ইমেল বৈধতার উপর নির্ভর করবেন না
স্ল্যাक्स

10
@ ম্যাথলক: না, আপনাকে এসকিউএল কোয়েরিগুলি থেকে বাঁচতে হবে (বা আরও ভাল, পরামিতি ব্যবহার করুন)। স্যানিটাইজেশন কোনও উপযুক্ত প্রতিরক্ষা নয়।
স্লাকস

535

এই প্রশ্নটি অনেক জিজ্ঞাসা করা হয়, তবে আমি মনে করি আপনার পিছনে ফিরে আসা উচিত এবং নিজেকে জিজ্ঞাসা করা উচিত কেন আপনি ইমেল ঠিকানাগুলি সিনট্যাক্টিকালি বৈধতা দিতে চান? আসলে কী লাভ?

  • এটি সাধারণ টাইপগুলি ধরবে না।
  • এটি লোককে অবৈধ বা আপ-আপ ইমেল ঠিকানা প্রবেশ করতে বা অন্য কারও ঠিকানা প্রবেশ করতে বাধা দেয় না।

আপনি যদি কোনও ইমেল সঠিক কিনা তা যাচাই করতে চান তবে আপনার কাছে একটি নিশ্চিতকরণ ইমেল প্রেরণ করা ছাড়া আর কোনও বিকল্প নেই এবং এর সাথে ব্যবহারকারীদের উত্তর রয়েছে। অনেক ক্ষেত্রে আপনি হবে আছে নিরাপত্তার কারণে বা নৈতিক কারণে যাহাই হউক না কেন একটি কনফার্মেশন মেইল পাঠাতে (যাতে আপনি তাদের ইচ্ছার বিরুদ্ধে একটি সেবা করার জন্য সাইন আপ কেউ যেমন করতে পারেন)।


91
এটি পরীক্ষা করে দেখতে পারা যায় যে তারা কেবল সাধারণ ভুলগুলি ধরার জন্য ক্লায়েন্ট সাইডের বৈধতার জন্য ক্ষেত্রের মধ্যে @ কিছু কিছু প্রবেশ করেছে - তবে সাধারণভাবে আপনি সঠিক।
মার্টিন বেকেট

8
মার্টিন, আমি আপনাকে একটি +1 দিয়েছিলাম কেবল পরে foobar @ dk পড়া বৈধ ইমেল। এটি সুন্দর হবে না তবে আপনি যদি উভয়ই আরএফসি অনুগত হতে এবং সাধারণ জ্ঞান ব্যবহার করতে চান তবে আপনার যেমন কেসগুলি সনাক্ত করা উচিত এবং ব্যবহারকারীকে এটি সঠিক কিনা তা নিশ্চিত করতে বলা উচিত।
ফিলাফ্রেও

105
@olavk: যদি কেউ টাইপো প্রবেশ করে (যেমন me@hotmail:), তারা অবশ্যই আপনার নিশ্চিতকরণ ইমেল পাবে না, এবং তারপরে তারা কোথায়? তারা আর আপনার সাইটে নেই এবং তারা কেন সাইন আপ করতে পারে তা ভাবছেন। আসলে না তারা নয় - তারা আপনার সম্পর্কে পুরোপুরি ভুলে গেছে। যাইহোক, যদি তারা আপনার সাথে থাকা অবস্থায় আপনি কেবল একটি রেইগেক্সের সাথে প্রাথমিক বুদ্ধি পরীক্ষা করতে পারতেন তবে তারা সরাসরি ত্রুটিটি ধরতে পারে এবং আপনি একটি সুখী ব্যবহারকারী পেয়েছেন।
নিকফ

5
@ জ্যাকসবিবি: আপনি একটি দুর্দান্ত বক্তব্য রেখেছেন। এটি আরএফসি প্রতি মাস্টার পাস করার কারণে এটির অর্থ এই নয় যে এটি ব্যবহারকারীর ঠিকানা really অন্যথায় এই সমস্ত president@whitehouse.govঠিকানাগুলি একটি খুব নেটবাসী কমান্ডার-ইন-চিফ ইঙ্গিত করে। :)
tchrist

39
এটি কালো বা সাদা হতে হবে না। যদি ই-মেইলটি ভুল দেখায়, ব্যবহারকারীকে তা জানাতে দিন। ব্যবহারকারী যদি এখনও এগিয়ে যেতে চান তবে তাকে ছেড়ে দিন। ব্যবহারকারীকে আপনার রেজেক্সের সাথে সামঞ্জস্য করতে বাধ্য করবেন না, বরং কোনও ভুল হতে পারে তা জানার জন্য ব্যবহারকারীকে একটি সরঞ্জাম হিসাবে রেজেক্স ব্যবহার করুন।
নিনজানির

354

এগুলি সবই নির্ভর করে আপনি কতটা সঠিক হতে চান। আমার উদ্দেশ্যগুলির জন্য, যেখানে আমি কেবল bob @ aol.com(ইমেলের ফাঁকা স্থানগুলি) বা steve(কোনও ডোমেন নেই) বা mary@aolcom(কম্পনের পূর্বে কোনও সময় নেই ) মতো জিনিসগুলি রাখার চেষ্টা করছি , আমি ব্যবহার করি

/^\S+@\S+\.\S+$/

অবশ্যই, এটি বৈধ ইমেল ঠিকানা নয় এমন জিনিসগুলির সাথে মিলবে, তবে সাধারণ সাধারণ ত্রুটিগুলি পাওয়ার বিষয় এটি।

সেই রেজেক্সে যে কোনও সংখ্যক পরিবর্তন করা যেতে পারে (এবং কিছু এই উত্তরের মন্তব্যে রয়েছে) তবে এটি সহজ, এবং সহজেই বোঝা যায়, এবং এটি একটি প্রথম চেষ্টা।


6
এটি foobar @ dk এর সাথে মেলে না যা একটি বৈধ এবং কার্যকরী ইমেল ঠিকানা (যদিও সম্ভবত বেশিরভাগ মেল সার্ভার এটি গ্রহণ করবে না বা
কোনও ডটকম

3
হ্যা এটা হবে. আমি আপনাকে নিজে চেষ্টা করে দেখুন। l পার্ল-লে'প্রিন্ট q{foo@bar.co.uk} = ~ /^\S+@\S+\.\S+$/? q {Y}: q {N} '
অ্যান্ডি লেস্টার

7
@ রিচার্ড: .এতে অন্তর্ভুক্ত রয়েছে \S
ডেভিড থর্নলি

43
জেজেজে: হ্যাঁ, এটি প্রচুর কড়কড়ের সাথে মিলবে। এটা তোলে ম্যাচ হবে & $ * # $ (@ $ 0 (%)) $ #।) & *) (* $, খুব। আমার জন্য, আমি আরো বিজোড় এলোমেলো কথা বলা-আঙুল টাইপো আকর্ষণীয় সঙ্গে সংশ্লিষ্ট নই মত mary@aolcomআমার চেয়ে সম্পূর্ণ আবর্জনা । ওয়াইএমএমভি।
অ্যান্ডি লেস্টার

5
কেবল @লক্ষণগুলির জন্য নিয়ন্ত্রণ করার জন্য : /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/ jsfiddle.net/b9chris/mXB96
ক্রিস মোসচিনি 21

338

এটি আপনার সর্বোত্তম বলতে কী বোঝায় তার উপর নির্ভর করে: আপনি যদি প্রতিটি বৈধ ইমেল ঠিকানা ধরার কথা বলছেন তবে নিম্নলিখিতটি ব্যবহার করুন:

(?:(?:\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*)

( http://www.ex-parrot.com/~pdw/Mail-RFC822-Adress.html ) আপনি যদি সহজ কিছু সন্ধান করছেন তবে এটি বেশিরভাগ বৈধ ইমেল ঠিকানাগুলির মতো কিছু চেষ্টা করবে:

"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"

সম্পাদনা: লিঙ্ক থেকে:

এই নিয়মিত প্রকাশটি কেবল এমন ঠিকানাগুলিকে বৈধতা দেবে যেগুলিতে কোনও মন্তব্য ছিনিয়ে নেওয়া এবং সাদা স্থানের পরিবর্তে প্রতিস্থাপন করা হয়েছে (এটি মডিউল দ্বারা সম্পন্ন হয়)।


10
এটি সমস্ত ঠিকানার সাথে মেলে না, কিছু প্রথমে রূপান্তরিত হতে হবে। লিঙ্কটি থেকে: "এই নিয়মিত অভিব্যক্তিটি কেবলমাত্র ঠিকানাগুলিকে বৈধতা দেবে যেগুলিতে কোনও মন্তব্য ছিনতাই করা হয়েছে এবং হোয়াইটস্পেসের সাথে প্রতিস্থাপন করা হয়েছে (এটি মডিউল দ্বারা সম্পন্ন হয়)"।
চস ওয়েন্স

47
আপনি কি আমাকে এমন কিছু উদাহরণ দিতে পারেন email addressযা ভুলভাবে দ্বিতীয়টির মধ্য দিয়ে যায় তবে লম্বা রেজেক্সের দ্বারা ধরা পড়ে?
লেজার

4
যদিও আমি একবার এটি পছন্দ করেছিলাম, এটি একটি আরএফসি 822 যাচাইকারক, কোনও আরএফসি 5322 নয় ।
tchrist

24
@ লাজার ইন..অন্যাল @ উদাহরণ.com একটি সাধারণ উদাহরণ হবে। লোকাল-অংশে আপনার কাছে টানা দুটি অব্যর্থ বিন্দু থাকার অনুমতি নেই।
রেন্ডাল শোয়ার্জ

5
@ মিখাইল পার্ল কিন্তু আপনার এটি ব্যবহার করা উচিত নয়।
শুভ ব্যক্তি

287

[আপডেট করা] আমি এখানে ইমেল ঠিকানা যাচাইকরণ সম্পর্কে আমার জানার সমস্ত কিছু ভাগ করেছি: http://isemail.info , যা এখন কেবল বৈধতা দেয় না তবে ইমেল ঠিকানাগুলির সাথে সমস্যাগুলিও সনাক্ত করে। আমি এখানে অনেক মন্তব্যে একমত যে বৈধতা শুধুমাত্র উত্তরের অংশ; আমার রচনাটি http://isemail.info/about দেখুন

is_email () রয়ে গেছে, যতদূর আমি জানি, কেবলমাত্র বৈধ প্রমাণক যা আপনাকে প্রদত্ত স্ট্রিংটি বৈধ ইমেল ঠিকানা কিনা তা নিশ্চিতভাবেই আপনাকে জানায়। আমি http://isemail.info/ এ একটি নতুন সংস্করণ আপলোড করেছি

আমি ক্যাল হেন্ডারসন, ডেভ চাইল্ড, ফিল হ্যাক, ডগ লাভল, আরএফসি5322 এবং আরএফসি 3696 থেকে পরীক্ষার কেসগুলি সংগ্রহ করেছি 27 সব মিলিয়ে 275 টি পরীক্ষার ঠিকানা। আমি যে সমস্ত নিখরচায় বৈধ যাচাইকারী খুঁজে পেতে পেরেছিলাম তার বিরুদ্ধে এই সমস্ত পরীক্ষা চালিয়েছি।

লোকেরা তাদের যাচাইকারীদের উন্নত করায় আমি এই পৃষ্ঠাটি আপ টু ডেট রাখার চেষ্টা করব। ক্যাল, মাইকেল, ডেভ, পল এবং ফিলকে এই পরীক্ষাগুলি সংকলন করতে এবং আমার নিজের বৈধকারীর গঠনমূলক সমালোচনা করার ক্ষেত্রে তাদের সহযোগিতা ও সহযোগিতার জন্য ধন্যবাদ জানাই

বিশেষত আরএফসি 3696 এর বিপরীতে লোকদের ত্রুটি সম্পর্কে সচেতন হওয়া উচিত । ক্যানোনিকাল উদাহরণগুলির মধ্যে তিনটি প্রকৃতপক্ষে অবৈধ ঠিকানা। এবং কোনও ঠিকানার সর্বোচ্চ দৈর্ঘ্য 254 বা 256 অক্ষর নয় 320।


এই বৈধকারকটিও সঠিক বলে মনে হচ্ছে। [... সময় কেটে যায় ...] এইচএম, দেখে মনে হচ্ছে এটি কেবল আরএফসি 5322, 3693 নয় বা এর থেকে ত্রুটিযুক্ত।
tchrist

1
খুব সুন্দর. এখানে আমরা কেবল একটি সুন্দর প্রবন্ধই পাই না, আমরা একটি বৈধতা পরীক্ষক পাশাপাশি ডাউনলোড করার জন্য একটি লাইব্রেরি পাই। চমৎকার উত্তর!
বিজিএম কোডার

আপনার বৈধকরণকারী পাণিকোড (আরএফসি 3492) সমর্থন করে না। name@öäü.at একটি বৈধ ঠিকানা হতে পারে। (এটি name@xn--4ca9at.at এ অনুবাদ করে)
জোসেফ মনিকাকে

হাই @ জোসেফ আপনার name@xn--4ca9at.atকোডটি যাচাই করার চেষ্টা করা উচিত যেহেতু এই কোডটি বৈধতার নয়, ব্যাখ্যার নয়। আপনি যদি একটি প্যানিকোড অনুবাদক যুক্ত করতে চান তবে আমি github.com/dominicsayers/isemail
ডমিনিক

266

ডাব্লু 3 সি এইচটিএমএল 5 স্পেস অনুযায়ী :

^[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])?)*$

প্রসঙ্গ:

একটি বৈধ ইমেল ঠিকানা একটি স্ট্রিং যা ABNF উত্পাদনের সাথে মেলে […]

দ্রষ্টব্য: এই প্রয়োজনীয়তাটি আরএফসি 5322 এর ইচ্ছাকৃত লঙ্ঘন যা ইমেল ঠিকানাগুলির জন্য একটি সিনট্যাক্স সংজ্ঞায়িত করে যা একই সাথে খুব কড়া ("@" চরিত্রের আগে), খুব অস্পষ্ট ("@" চরিত্রের পরে) এবং খুব শিথিল ( মন্তব্যগুলি, সাদা বর্ণের অক্ষরগুলি এবং বেশিরভাগ ব্যবহারকারীর কাছে অপরিচিত আচরণের ক্ষেত্রে উদ্ধৃত স্ট্রিংগুলিকে ব্যবহারিক ব্যবহার হতে দেওয়া হচ্ছে।

নিম্নলিখিত জাভাস্ক্রিপ্ট- এবং পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত প্রকাশটি উপরের সংজ্ঞাটির একটি বাস্তবায়ন।

/^[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])?)*$/


12
এটা মজার. এটি আরএফসি লঙ্ঘন, কিন্তু একটি ইচ্ছাকৃত এবং এটি sesne করে তোলে। বাস্তব বিশ্বের উদাহরণ: জিমেইল @ এর পূর্বে অংশগুলিতে বিন্দু উপেক্ষা করে, সুতরাং আপনার ইমেলটি যদি test@gmail.com হয় তবে আপনি পরীক্ষার জন্য ইমেলগুলি প্রেরণ করতে পারেন @ @ gmail.com বা পরীক্ষা .... @ gmail.com, এই ঠিকানা দুটিই আরএফসি অনুসারে অবৈধ, তবে বাস্তব বিশ্বে বৈধ।
ভ্যালেন্টিনাস

আমার মনে হয় শেষ অংশটি '*' এর পরিবর্তে '+' হওয়া উচিত: a [a-zA-Z0-9।! # $% & '* + / =? ^ _ `{|} ~ -] + @ [a- zA-Z0-9 -] + (?: \। [a-zA-Z0-9 -] +) + +
মিমি মিমি

7
@ এমএমএমএমএম john.doe@localhostবৈধ। নিশ্চিতভাবেই, আসল ওয়ার্ল্ড অ্যাপ্লিকেশনটিতে (অর্থাত্ একটি সম্প্রদায়), আমি আপনার
পরামর্শটি

3
@ ভ্যালেন্টিনাস আসলে, আরএফসি এই স্থানীয় অংশগুলিকে বাদ দেয় না , তবে সেগুলি উদ্ধৃত করতে হবে। "test...."@gmail.comআরএফসি অনুসারে পুরোপুরি বৈধ এবং শব্দার্থগত সমতুল্য test....@gmail.com
রিংকে

আমি যদি @ বা .. @ দিয়ে কোনও ঠিকানায় প্রেরণের চেষ্টা করি তবে আমার সংস্থার রিলে মাধ্যমে পাইথন ব্যবহার করে ইমেল প্রেরণের চেষ্টা করার সময় আমি একটি ত্রুটি পেয়েছি। আসলে এটি একটি _ @ এর ক্ষেত্রেও হয়। প্রেরকরা এটি করবেন বলে বিশ্বাস করার চেয়ে আমি প্রেরণের আগে তাদের অপসারণ করি।
এনডিভো

201

এটি পার্ল ৫.১০ বা আরও নতুনতে সহজ:

/(?(DEFINE)
   (?<address>         (?&mailbox) | (?&group))
   (?<mailbox>         (?&name_addr) | (?&addr_spec))
   (?<name_addr>       (?&display_name)? (?&angle_addr))
   (?<angle_addr>      (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
   (?<group>           (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ;
                                          (?&CFWS)?)
   (?<display_name>    (?&phrase))
   (?<mailbox_list>    (?&mailbox) (?: , (?&mailbox))*)

   (?<addr_spec>       (?&local_part) \@ (?&domain))
   (?<local_part>      (?&dot_atom) | (?&quoted_string))
   (?<domain>          (?&dot_atom) | (?&domain_literal))
   (?<domain_literal>  (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
                                 \] (?&CFWS)?)
   (?<dcontent>        (?&dtext) | (?&quoted_pair))
   (?<dtext>           (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e])

   (?<atext>           (?&ALPHA) | (?&DIGIT) | [!#\$%&'*+-/=?^_`{|}~])
   (?<atom>            (?&CFWS)? (?&atext)+ (?&CFWS)?)
   (?<dot_atom>        (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
   (?<dot_atom_text>   (?&atext)+ (?: \. (?&atext)+)*)

   (?<text>            [\x01-\x09\x0b\x0c\x0e-\x7f])
   (?<quoted_pair>     \\ (?&text))

   (?<qtext>           (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e])
   (?<qcontent>        (?&qtext) | (?&quoted_pair))
   (?<quoted_string>   (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
                        (?&FWS)? (?&DQUOTE) (?&CFWS)?)

   (?<word>            (?&atom) | (?&quoted_string))
   (?<phrase>          (?&word)+)

   # Folding white space
   (?<FWS>             (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
   (?<ctext>           (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
   (?<ccontent>        (?&ctext) | (?&quoted_pair) | (?&comment))
   (?<comment>         \( (?: (?&FWS)? (?&ccontent))* (?&FWS)? \) )
   (?<CFWS>            (?: (?&FWS)? (?&comment))*
                       (?: (?:(?&FWS)? (?&comment)) | (?&FWS)))

   # No whitespace control
   (?<NO_WS_CTL>       [\x01-\x08\x0b\x0c\x0e-\x1f\x7f])

   (?<ALPHA>           [A-Za-z])
   (?<DIGIT>           [0-9])
   (?<CRLF>            \x0d \x0a)
   (?<DQUOTE>          ")
   (?<WSP>             [\x20\x09])
 )

 (?&address)/x

20
পাইথনে এটি দেখতে পছন্দ করবে
tdc

4
আমি মনে করি যে addrspecঅংশটির কেবলমাত্র একটি উপসেটই প্রশ্নের সাথে প্রাসঙ্গিক। এর চেয়ে বেশি গ্রহণ এবং এটিকে ফরোয়ার্ড করা যদিও সিস্টেমের অন্য কিছু অংশ যা সম্পূর্ণ আরএফসি 588 অ্যাড্রেস গ্রহণ করতে প্রস্তুত নয়, শুটিংয়ের মতো এটি নিজের পা।
ডলম্যান

3
দুর্দান্ত (+1) তবে প্রযুক্তিগতভাবে এটি অবশ্যই কোনও রেজেক্স নয় ... (যা ব্যাকরণ নিয়মিত না হওয়ার কারণে এটি অসম্ভব)।
রিংকে

10
রেজেক্সস কিছুদিন আগে নিয়মিত হওয়া বন্ধ করে দেয়। এটি যদিও একটি বৈধ পার্ল 'রেইজেক্স'!
rjh

4
আমি আইডিয়নে এই রেজেক্সের জন্য একটি পরীক্ষা স্থাপন করেছি: আইডিয়োনা / টু এক্সএফএইচ তবে এটি "পুরোপুরি সঠিক নয়"। কেউ চিম ইন যত্ন নিতে হবে? আমি কিছু অনুপস্থিত করছি?
মাইক 17

159

আমি ব্যবহার করি

^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

যা নিয়মিতভাবে এক্সপ্রেশনভালিডেটর দ্বারা এএসপি.এনইটি-তে ব্যবহৃত একটি।


28
ছি! আমার (অদ্বিতীয় পরামর্শ দেওয়া) ঠিকানা !@mydomain.netবাতিল করা হয়েছে।
ফ্রেগজ

3
এই পৃষ্ঠার তথ্য অনুসারে.আইএনএআর.এ.আর.টি.এল.ডি. / টিल्डস- আলফা- বাই- ডোমেন.txt শীর্ষ স্তরের যেমন একটি অক্ষর যেমন "কিছু। কমপক্ষে 2 টি অক্ষর সমর্থন করুন: " ^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w{2,}([-.]\\w+)*$
কিছু.পিএল

4
@ ওয়াইন হুইটি আপনি ইমেলের বৈধতা যাচাই করা বাদ দিয়ে বিপুল সংখ্যাগরিষ্ঠ ঠিকানা, বা সমস্ত, যা কেউ ব্যবহার করবেন না সেগুলি পূরণ করতে হবে কিনা তার প্রাথমিক ইস্যুটিতে আপনি আঘাত করেছেন।
পতঞ্জলি

আপনার উত্তরে @ টমাসজজুল্ক অতিরিক্ত ব্যয় স্ল্যাশ বিভ্রান্ত করছে, আমি কেবল এটি সংশোধন করেছি এবং 2 টি অক্ষরের ডোমেন নামের সমর্থন কাজ করছে, ^ \ ডাব্লু + ([- +। '] \ ডাব্লু +) * @ \ ডাব্লু ([-।] \ ডাব্লু +) * \। \ w {2,} ([-।] \ w +) * $
আকিব মমতাজ

2
এটি ব্যর্থ হয়েছে simon-@hotmail.comযার ভিত্তিতে সত্যই বৈধ (আমাদের গ্রাহকের একই ঠিকানা ছিল)
Sim

142

সেরা সম্পর্কে জানি না, কিন্তু এই এক অন্তত সঠিক, যতদিন ঠিকানাগুলি তাদের মন্তব্য ছিনতাই এবং হোয়াইটস্পেস দিয়ে প্রতিস্থাপিত আছে।

সিরিয়াসলি। ইমেলগুলি যাচাই করার জন্য আপনার ইতিমধ্যে একটি লিখিত গ্রন্থাগার ব্যবহার করা উচিত। সর্বোত্তম উপায় হ'ল সেই ঠিকানায় কেবল একটি যাচাইকরণ ইমেল প্রেরণ করা।


2
আমি যতদূর জানি কিছু গ্রন্থাগারও ভুল are আমি অস্পষ্টভাবে মনে রাখতে পারি যে পিএইচপি পিয়ারে এরকম একটি বাগ ছিল।
বোর্টজমায়ার

সেই পৃষ্ঠাতেও অনুমান থেকে কয়েকটি জিনিস সম্পর্কে নীচে একটি অস্বীকৃতি রয়েছে। যে regexp সমর্থন করে না।
ক্রিস ভেস্ট

7
এটি একটি আরএফসি 822 স্পেক, কোনও আরএফসি 5322 অনুমান নয়।
tchrist

12
শেষ পর্যন্ত, তিনি ঠিক বলেছেন যে কোনও ইমেল ঠিকানা সত্যই যাচাই করার একমাত্র উপায় হ'ল এটিতে একটি ইমেল প্রেরণ করা এবং একটি উত্তরের জন্য অপেক্ষা করা।
ব্লেজমোনজার

109

আমি যে ইমেল ঠিকানাগুলি যাচাই করতে চাইছি সেগুলি এএসপি.এনইটি ওয়েব অ্যাপ্লিকেশন দ্বারা সিস্টেম. নেট.মেল নেমস্পেস ব্যবহার করে লোকের তালিকায় ইমেল প্রেরণ করা হবে। সুতরাং, কিছু খুব জটিল নিয়মিত এক্সপ্রেশন ব্যবহার না করে, আমি ঠিক ঠিকানা থেকে একটি মেল ঠিকানা ঠিকানা তৈরি করার চেষ্টা করি try ঠিকানাটি সঠিকভাবে তৈরি না করা হলে মেলএড্রেস কনস্ট্রাস্টার একটি ব্যতিক্রম ছুঁড়ে মারবে। এইভাবে, আমি জানি আমি অন্তত দরজা থেকে ইমেলটি পেতে পারি। অবশ্যই এটি সার্ভার-পাশের বৈধতা তবে ন্যূনতম সময়ে আপনার এটি যাইহোক প্রয়োজন।

protected void emailValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
    try
    {
        var a = new MailAddress(txtEmail.Text);
    }
    catch (Exception ex)
    {
        args.IsValid = false;
        emailValidator.ErrorMessage = "email: " + ex.Message;
    }
}

3
একটি ভাল পয়েন্ট। এমনকি যদি এই সার্ভারের বৈধতা কিছু বৈধ ঠিকানা প্রত্যাখ্যান করে তবে সমস্যা নেই কারণ আপনি যে কোনওভাবেই এই নির্দিষ্ট সার্ভার প্রযুক্তি ব্যবহার করে এই ঠিকানায় প্রেরণ করতে পারবেন না। অথবা আপনি ডিফল্ট সরঞ্জামগুলির পরিবর্তে কোনও তৃতীয় পক্ষের ইমেলিং লাইব্রেরি ব্যবহার করে একই জিনিসগুলি করার চেষ্টা করতে পারেন।
ব্যবহারকারী

আমি সত্যিই পছন্দ করি এটি কীভাবে উপকৃত হয়। নেট ফ্রেমওয়ার্ক কোড - চাকাটি পুনর্বহাল করার কোনও ধারণা নেই। এটি দুর্দান্ত। সহজ, পরিষ্কার এবং আশ্বাস দেয় যে আপনি আসলে ইমেলটি প্রেরণ করতে পারবেন। মহান কাজ.
কোরি হাউস

... হ্যাঁ এবং এটি কীভাবে যাচাই করে আগ্রহী তাদের জন্য রিফ্লেক্টরে কোডটি দেখুন - এটির বেশ কিছুটা - এবং এটি কোনও নিয়মিত প্রকাশ নয়!
টম কার্টার

2
কেবলমাত্র একটি দ্রষ্টব্য: আপনি যদি কেবল বৈধতার জন্য এটি ব্যবহার করতে চান (এবং পাশাপাশি প্রেরণও করবেন না, তবে এটি উপরে বর্ণিত একটি মোটা পয়েন্ট) মেলএড্রেস ক্লাস আরএফসি5322 এর সাথে মেলে না। দেখুন: stackoverflow.com/questions/6023589/...
porges

কেবলমাত্র একটি ছোটখাটো সমস্যা: আপনি যদি নিজের সার্ভারের পার্শ্বের বৈধতা প্রদানকারী কোডটি পুনরায় ব্যবহারযোগ্য করতে চান (তবে এই ক্ষেত্রে বা সাধারণত), আমি হার্ড-কোডডের args.Valueমতো ক্ষেত্রটি উল্লেখ করার পরিবর্তে ব্যবহার করার পরামর্শ দিই txtEmail.Text। পরেরটি আপনার বৈধকে একক নিয়ন্ত্রণের সাথে আবদ্ধ করবে, এটি ঠিক আছে, যতক্ষণ না আপনার একক ইমেল ক্ষেত্র থাকে তবে অন্যথায় প্রস্তাবিত হয় না not
ফোল্পার

109

দ্রুত উত্তর

ইনপুট বৈধতার জন্য নিম্নলিখিত রেজেেক্স ব্যবহার করুন:

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+

এই রেজেক্সের সাথে মিলিত ঠিকানাগুলি:

  • আরএফসি 5321/5322 এর সাথে কঠোরভাবে মেনে চলে এমন একটি স্থানীয় অংশ (যেমন @-সাইন এর আগে অংশ) রয়েছে,
  • একটি ডোমেন অংশ রয়েছে (যেমন @ -Sign এর পরে অংশ) যা কমপক্ষে দুটি লেবেল সহ একটি হোস্টের নাম, যার প্রতিটিই সর্বাধিক characters৩ টি অক্ষর দীর্ঘ।

দ্বিতীয় সীমাবদ্ধতা আরএফসি 5321/5322 এ একটি বিধিনিষেধ।

বিস্তারিত উত্তর

ইমেল ঠিকানাগুলি সনাক্ত করে এমন একটি নিয়মিত অভিব্যক্তি ব্যবহার করা বিভিন্ন পরিস্থিতিতে কার্যকর হতে পারে: উদাহরণস্বরূপ কোনও নথিতে ইমেল ঠিকানাগুলির জন্য স্ক্যান করা, ব্যবহারকারীর ইনপুটকে বৈধতা দিতে বা কোনও ডেটা সংগ্রহস্থলে অখণ্ডতার সীমাবদ্ধতা হিসাবে।

তবে এটি লক্ষ করা উচিত যে আপনি যদি ঠিকানাটি একটি বিদ্যমান মেলবক্সকে প্রকৃতপক্ষে উল্লেখ করে কিনা তা জানতে চাইলে ঠিকানায় কোনও বার্তা প্রেরণের বিকল্প নেই। যদি আপনি কেবল কোনও ঠিকানাটি ব্যাকরণগতভাবে সঠিক কিনা তা পরীক্ষা করতে চান তবে আপনি একটি নিয়মিত অভিব্যক্তি ব্যবহার করতে পারেন, তবে এটি নোট করুন""@[] ব্যাকরণগতভাবে সঠিক ইমেল ঠিকানা যা অবশ্যই কোনও বিদ্যমান মেলবক্সকে উল্লেখ করে না।

ইমেল ঠিকানাগুলির বাক্য গঠনটি বিভিন্ন আরএফসিগুলিতে সংজ্ঞায়িত করা হয়েছে , উল্লেখযোগ্যভাবে আরএফসি 822 এবং আরএফসি 5322 । আরএফসি 822 কে "আসল" স্ট্যান্ডার্ড হিসাবে এবং আরএফসি 5322 কে সর্বশেষ মান হিসাবে দেখা উচিত। আরএফসি 822 এ সংজ্ঞায়িত সিনট্যাক্সটি সবচেয়ে লেনিয়েন্ট এবং পরবর্তী মানগুলি সিনট্যাক্সটিকে আরও এবং আরও সীমিত করেছে, যেখানে নতুন সিস্টেম বা পরিষেবাগুলি অপ্রচলিত সিনট্যাক্সকে স্বীকৃতি দিতে পারে, তবে কখনই এটি উত্পাদন করে না।

এই উত্তরে আমি "ইমেল ঠিকানা" নেব যার অর্থ addr-specআরএফসিগুলিতে সংজ্ঞায়িত হয়েছে (যেমন jdoe@example.org, তবে নয় "John Doe"<jdoe@example.org>, নাও)some-group:jdoe@example.org,mrx@exampel.org; )।

আরএফসি সিনট্যাক্সগুলি রেজেক্সে অনুবাদ করার ক্ষেত্রে একটি সমস্যা আছে: সিনট্যাক্সগুলি নিয়মিত নয়! এটি কারণ তারা ইমেল ঠিকানাগুলিতে alচ্ছিক মন্তব্যের জন্য মঞ্জুরি দেয় যা অসীমভাবে বাসা বেঁধে দেওয়া যেতে পারে, অন্যদিকে নিয়মিত প্রকাশের মাধ্যমে অসীম বাসা বেঁধে দেওয়া যায় না। মন্তব্যযুক্ত ঠিকানাগুলির জন্য স্ক্যান করতে বা যাচাই করতে আপনার একটি পার্সার বা আরও শক্তিশালী এক্সপ্রেশন দরকার। (নোট করুন যে পার্লের মতো ভাষাগুলি প্রসঙ্গমুক্ত ব্যাকরণগুলিকে একটি রেজেক্সের মতো উপায়ে বর্ণনা করার জন্য কনস্ট্রাক্টস রয়েছে।) এই উত্তরে আমি মন্তব্যগুলিকে উপেক্ষা করব এবং কেবল সঠিক নিয়মিত অভিব্যক্তি বিবেচনা করব।

আরএফসিগুলি ইমেল বার্তাগুলির জন্য সিনট্যাক্সগুলি সংজ্ঞায়িত করে, যেমন ইমেল ঠিকানাগুলির জন্য নয়। ঠিকানাগুলি বিভিন্ন শিরোনাম ক্ষেত্রগুলিতে উপস্থিত হতে পারে এবং এখান থেকেই সেগুলি প্রাথমিকভাবে সংজ্ঞায়িত করা হয়। যখন তারা শিরোনাম ক্ষেত্রগুলিতে উপস্থিত হয় ঠিকানাগুলিতে (লেজিকাল টোকেনগুলির মধ্যে) সাদা স্থান, মন্তব্য এবং লাইনব্র্যাক থাকতে পারে। শব্দার্থগতভাবে যদিও এর কোনও তাত্পর্য নেই। কোনও ঠিকানা থেকে এই সাদা স্থান ইত্যাদি সরিয়ে আপনি শব্দার্থগত সমতুল্য ক্যানোনিকাল উপস্থাপনা পাবেন । সুতরাং, এর আধ্যাত্মিক উপস্থাপনা first. last (comment) @ [3.5.7.9]হয় first.last@[3.5.7.9]

বিভিন্ন উদ্দেশ্যে বিভিন্ন সিনট্যাক্স ব্যবহার করা উচিত। আপনি যদি কোনও (সম্ভবত খুব পুরানো) নথিতে ইমেল ঠিকানাগুলির জন্য স্ক্যান করতে চান তবে আরএফসি 822-এ বর্ণিত সংশ্লেষটি ব্যবহার করা ভাল ধারণা হতে পারে the অন্যদিকে, আপনি যদি ব্যবহারকারী ইনপুটকে বৈধ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন আরএফসি 5322-তে সংজ্ঞায়িত হিসাবে বাক্য গঠন সম্ভবত সম্ভবত কেবলমাত্র উপস্থাপনা গ্রহণ করে। কোন নির্দিষ্ট বাক্যটি আপনার নির্দিষ্ট ক্ষেত্রে প্রযোজ্য তা সিদ্ধান্ত নেওয়া উচিত।

আমি ASCII সামঞ্জস্যপূর্ণ অক্ষর সেটটি ধরে ধরে এই উত্তরে POSIX "বর্ধিত" নিয়মিত এক্সপ্রেশন ব্যবহার করি।

আরএফসি 822

আমি নিম্নলিখিত নিয়মিত প্রকাশে পৌঁছেছি। আমি সবাইকে এটি চেষ্টা করে বিরতি দেওয়ার জন্য আমন্ত্রণ জানাচ্ছি। আপনি যদি কোনও মিথ্যা ধনাত্মক বা মিথ্যা নেতিবাচক সন্ধান পান তবে দয়া করে তাদের একটি মন্তব্যে পোস্ট করুন এবং আমি যত তাড়াতাড়ি সম্ভব ভাবটি ঠিক করার চেষ্টা করব।

([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*]))*

আমি বিশ্বাস করি সম্পূর্ণরূপে বোঝায় যা RFC 822 সহ complient এর ত্রুটি-বিচ্যুতি । এটি কেবলমাত্র ইমেল ঠিকানাগুলি তাদের প্রমিত আকারে স্বীকৃতি দেয়। সাদা অংশকে (ভাঁজ করা) স্বীকৃতিপ্রাপ্ত একটি রেগেক্সের জন্য নীচের উপকরণটি দেখুন।

অনুভূতিটি দেখায় যে আমি কীভাবে অভিব্যক্তিটিতে পৌঁছেছি। আমি আরএফসি থেকে সমস্ত প্রাসঙ্গিক ব্যাকরণের নিয়মগুলি ঠিক যেমন প্রদর্শিত হয় তার তালিকাভুক্ত করি, তারপরে সংশ্লিষ্ট রেজেক্স। যেখানে একটি ত্রুটি প্রকাশিত হয়েছে আমি সংশোধন ব্যাকরণ নিয়মের জন্য পৃথক অভিব্যক্তি দিই ("ইররাটাম চিহ্নিত") এবং পরবর্তী নিয়মিত অভিব্যক্তিগুলিতে একটি আপডেট এক্সপ্রেশন হিসাবে আপডেট হওয়া সংস্করণটি ব্যবহার করি।

অনুচ্ছেদ ৩.১.৪ তে বর্ণিত হয়েছে। আরএফসি 822 এর alচ্ছিক রৈখিক সাদা স্থান লেক্সিকাল টোকেনগুলির মধ্যে সন্নিবেশ করা যেতে পারে। প্রযোজ্য যেখানে আমি এই নিয়মটি মানিয়ে নিতে এক্সপ্রেশনগুলি প্রসারিত করেছি এবং ফলাফলটিকে "opt-lwsp" দিয়ে চিহ্নিত করেছি।

CHAR        =  <any ASCII character>
            =~ .

CTL         =  <any ASCII control character and DEL>
            =~ [\x00-\x1F\x7F]

CR          =  <ASCII CR, carriage return>
            =~ \r

LF          =  <ASCII LF, linefeed>
            =~ \n

SPACE       =  <ASCII SP, space>
            =~  

HTAB        =  <ASCII HT, horizontal-tab>
            =~ \t

<">         =  <ASCII quote mark>
            =~ "

CRLF        =  CR LF
            =~ \r\n

LWSP-char   =  SPACE / HTAB
            =~ [ \t]

linear-white-space =  1*([CRLF] LWSP-char)
                   =~ ((\r\n)?[ \t])+

specials    =  "(" / ")" / "<" / ">" / "@" /  "," / ";" / ":" / "\" / <"> /  "." / "[" / "]"
            =~ [][()<>@,;:\\".]

quoted-pair =  "\" CHAR
            =~ \\.

qtext       =  <any CHAR excepting <">, "\" & CR, and including linear-white-space>
            =~ [^"\\\r]|((\r\n)?[ \t])+

dtext       =  <any CHAR excluding "[", "]", "\" & CR, & including linear-white-space>
            =~ [^][\\\r]|((\r\n)?[ \t])+

quoted-string  =  <"> *(qtext|quoted-pair) <">
               =~ "([^"\\\r]|((\r\n)?[ \t])|\\.)*"
(erratum)      =~ "(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"

domain-literal =  "[" *(dtext|quoted-pair) "]"
               =~ \[([^][\\\r]|((\r\n)?[ \t])|\\.)*]
(erratum)      =~ \[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]

atom        =  1*<any CHAR except specials, SPACE and CTLs>
            =~ [^][()<>@,;:\\". \x00-\x1F\x7F]+

word        =  atom / quoted-string
            =~ [^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"

domain-ref  =  atom

sub-domain  =  domain-ref / domain-literal
            =~ [^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]

local-part  =  word *("." word)
            =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*
(opt-lwsp)  =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*

domain      =  sub-domain *("." sub-domain)
            =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(opt-lwsp)  =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*

addr-spec   =  local-part "@" domain
            =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(opt-lwsp)  =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")((\r\n)?[ \t])*(\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*")((\r\n)?[ \t])*)*@((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*])(((\r\n)?[ \t])*\.((\r\n)?[ \t])*([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]|(\r\n)?[ \t]))*(\\\r)*]))*
(canonical) =~ ([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*")(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|"(\n|(\\\r)*([^"\\\r\n]|\\[^\r]))*(\\\r)*"))*@([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*])(\.([^][()<>@,;:\\". \x00-\x1F\x7F]+|\[(\n|(\\\r)*([^][\\\r\n]|\\[^\r]))*(\\\r)*]))*

আরএফসি 5322

আমি নিম্নলিখিত নিয়মিত প্রকাশে পৌঁছেছি। আমি সবাইকে এটি চেষ্টা করে বিরতি দেওয়ার জন্য আমন্ত্রণ জানাচ্ছি। আপনি যদি কোনও মিথ্যা ধনাত্মক বা মিথ্যা নেতিবাচক সন্ধান পান তবে দয়া করে তাদের একটি মন্তব্যে পোস্ট করুন এবং আমি যত তাড়াতাড়ি সম্ভব ভাবটি ঠিক করার চেষ্টা করব।

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*])

আমি বিশ্বাস করি সম্পূর্ণরূপে জন্য RFC 5322 সহ complient এর ত্রুটি-বিচ্যুতি । এটি কেবলমাত্র ইমেল ঠিকানাগুলি তাদের প্রমিত আকারে স্বীকৃতি দেয়। সাদা অংশকে (ভাঁজ করা) স্বীকৃতিপ্রাপ্ত একটি রেগেক্সের জন্য নীচের উপকরণটি দেখুন।

অনুভূতিটি দেখায় যে আমি কীভাবে অভিব্যক্তিটিতে পৌঁছেছি। আমি আরএফসি থেকে সমস্ত প্রাসঙ্গিক ব্যাকরণের নিয়মগুলি ঠিক যেমন প্রদর্শিত হয় তার তালিকাভুক্ত করি, তারপরে সংশ্লিষ্ট রেজেক্স। নিয়মগুলির জন্য যা শব্দার্থবিজ্ঞানহীন অপ্রাসঙ্গিক (ভাঁজ) সাদা স্থান অন্তর্ভুক্ত, আমি একটি পৃথক রেইজেক্স "(সাধারণীকরণ") চিহ্নিত করি যা এই সাদা স্থানটিকে গ্রহণ করে না।

আমি আরএফসির সমস্ত "obs-" নিয়ম উপেক্ষা করেছি। এর অর্থ হ'ল রেজিেক্সগুলি কেবলমাত্র ইমেল ঠিকানার সাথে মেলে যা কঠোরভাবে আরএফসি 5322 অনুসারে হয়। আপনার যদি "পুরানো" ঠিকানাগুলি মিল করতে হয় (যেমন "obs-" বিধিগুলি সহ লুজার ব্যাকরণটি রয়েছে), আপনি পূর্ববর্তী অনুচ্ছেদ থেকে আরএফসি 822 এর মধ্যে একটি রেজেক্সেস ব্যবহার করতে পারেন।

VCHAR           =   %x21-7E
                =~  [!-~]

ALPHA           =   %x41-5A / %x61-7A
                =~  [A-Za-z]

DIGIT           =   %x30-39
                =~  [0-9]

HTAB            =   %x09
                =~  \t

CR              =   %x0D
                =~  \r

LF              =   %x0A
                =~  \n

SP              =   %x20
                =~  

DQUOTE          =   %x22
                =~  "

CRLF            =   CR LF
                =~  \r\n

WSP             =   SP / HTAB
                =~  [\t ]

quoted-pair     =   "\" (VCHAR / WSP)
                =~  \\[\t -~]

FWS             =   ([*WSP CRLF] 1*WSP)
                =~  ([\t ]*\r\n)?[\t ]+

ctext           =   %d33-39 / %d42-91 / %d93-126
                =~  []!-'*-[^-~]

("comment" is left out in the regex)
ccontent        =   ctext / quoted-pair / comment
                =~  []!-'*-[^-~]|(\\[\t -~])

(not regular)
comment         =   "(" *([FWS] ccontent) [FWS] ")"

(is equivalent to FWS when leaving out comments)
CFWS            =   (1*([FWS] comment) [FWS]) / FWS
                =~  ([\t ]*\r\n)?[\t ]+

atext           =   ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~"
                =~  [-!#-'*+/-9=?A-Z^-~]

dot-atom-text   =   1*atext *("." 1*atext)
                =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*

dot-atom        =   [CFWS] dot-atom-text [CFWS]
                =~  (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*

qtext           =   %d33 / %d35-91 / %d93-126
                =~  []!#-[^-~]

qcontent        =   qtext / quoted-pair
                =~  []!#-[^-~]|(\\[\t -~])

(erratum)
quoted-string   =   [CFWS] DQUOTE ((1*([FWS] qcontent) [FWS]) / FWS) DQUOTE [CFWS]
                =~  (([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  "([]!#-[^-~ \t]|(\\[\t -~]))+"

dtext           =   %d33-90 / %d94-126
                =~  [!-Z^-~]

domain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
                =~  (([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  \[[\t -Z^-~]*]

local-part      =   dot-atom / quoted-string
                =~  (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+"

domain          =   dot-atom / domain-literal
                =~  (([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?
(normalized)    =~  [-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*]

addr-spec       =   local-part "@" domain
                =~  ((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?"(((([\t ]*\r\n)?[\t ]+)?([]!#-[^-~]|(\\[\t -~])))+(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?)"(([\t ]*\r\n)?[\t ]+)?)@((([\t ]*\r\n)?[\t ]+)?[-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*(([\t ]*\r\n)?[\t ]+)?|(([\t ]*\r\n)?[\t ]+)?\[((([\t ]*\r\n)?[\t ]+)?[!-Z^-~])*(([\t ]*\r\n)?[\t ]+)?](([\t ]*\r\n)?[\t ]+)?)
(normalized)    =~  ([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|\[[\t -Z^-~]*])

নোট কিছু সূত্র (বিশেষতঃ যে W3C ) বলে যে দাবি করা বোঝায় যা RFC 5322 স্থানীয় পক্ষ থেকে খুব কঠোর (অর্থাত আগে @ -sign অংশ)। এটি কারণ "..", "এ..বি" এবং "এ"। হয় না বৈধ ডট পরমাণু যখন তারা ডাকবাক্স নাম হিসাবে ব্যবহার করা যেতে পারে। জন্য RFC অবশ্য নেই এই মতো স্থানীয় অংশের জন্য অনুমতি ছাড়া যে তারা উদ্ধৃত করা থাকতে হবে। সুতরাং আপনি পরিবর্তে a..b@example.netলিখতে হবে "a..b"@example.net, যা শব্দার্থ সমতুল্য।

আরও বিধিনিষেধ

এসএমটিপি ( আরএফসি 5321 অনুসারে সংজ্ঞায়িত ) বৈধ ইমেল ঠিকানাগুলির সেটকে আরও সীমাবদ্ধ করে (বা আসলে: মেলবক্সের নাম)। এই কঠোর ব্যাকরণ আরোপ করা যুক্তিসঙ্গত বলে মনে হচ্ছে, যাতে মিলিত ইমেল ঠিকানাটি আসলে ইমেল প্রেরণে ব্যবহার করা যায়।

আরএফসি 5321 মূলত "লোকাল" অংশটি ছেড়ে দেয় (অর্থাত্ @-সাইন এর আগে অংশ), তবে এটি ডোমেন অংশে (অর্থাত্ @-সিগনের পরে অংশ) কঠোর। এটি কেবল ডোম-পরমাণুর জায়গায় হোস্টের নাম এবং ডোমেন আক্ষরিকের পরিবর্তে ঠিকানা আক্ষরিকের অনুমতি দেয়।

আরএফসি 5321 এ উপস্থাপিত ব্যাকরণটি খুব স্বাচ্ছন্দ্যযুক্ত যখন এটি হোস্টের নাম এবং আইপি ঠিকানার উভয় ক্ষেত্রেই আসে। আমি এই খসড়াটি এবং আরএফসি 1034 নির্দেশিকা হিসাবে ব্যবহার করে, প্রশ্নে বিধিগুলি "সংশোধন" করার স্বাধীনতা নিয়েছি । ফলাফলের রেজেক্স এখানে।

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|\[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])

নোট করুন যে ব্যবহারের কেসটির উপর নির্ভর করে আপনি আপনার রেজেজেলে কোনও "সাধারণ-ঠিকানা-আক্ষরিক" এর অনুমতি দিতে না চাইতে পারেন। এছাড়াও নোট করুন যে আমি (?!IPv6:)"জেনারেল-ঠিকানা-আক্ষরিক" অংশটি বিকৃত আইপিভি 6 অ্যাড্রেসগুলির সাথে মেলে রোধ করার জন্য চূড়ান্ত রেজেক্সে নেতিবাচক চেহারা হিসাবে ব্যবহার করেছি । কিছু রিজেক্স প্রসেসর নেতিবাচক চেহারা অবধি সমর্থন করে না। সাবস্ট্রিং সরান|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+আপনি যদি পুরো "সাধারণ-ঠিকানা-আক্ষরিক" অংশটি বাইরে নিতে চান তবে রেজিজ থেকে স্ট্রিংগুলি ।

এখানে ডেরাইভেশন:

Let-dig         =   ALPHA / DIGIT
                =~  [0-9A-Za-z]

Ldh-str         =   *( ALPHA / DIGIT / "-" ) Let-dig
                =~  [0-9A-Za-z-]*[0-9A-Za-z]

(regex is updated to make sure sub-domains are max. 63 charactes long - RFC 1034 section 3.5)
sub-domain      =   Let-dig [Ldh-str]
                =~  [0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?

Domain          =   sub-domain *("." sub-domain)
                =~  [0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*

Snum            =   1*3DIGIT
                =~  [0-9]{1,3}

(suggested replacement for "Snum")
ip4-octet       =   DIGIT / %x31-39 DIGIT / "1" 2DIGIT / "2" %x30-34 DIGIT / "25" %x30-35
                =~  25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9]

IPv4-address-literal    =   Snum 3("."  Snum)
                        =~  [0-9]{1,3}(\.[0-9]{1,3}){3}

(suggested replacement for "IPv4-address-literal")
ip4-address     =   ip4-octet 3("." ip4-octet)
                =~  (25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}

(suggested replacement for "IPv6-hex")
ip6-h16         =   "0" / ( (%x49-57 / %x65-70 /%x97-102) 0*3(%x48-57 / %x65-70 /%x97-102) )
                =~  0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}

(not from RFC)
ls32            =   ip6-h16 ":" ip6-h16 / ip4-address
                =~  (0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}

(suggested replacement of "IPv6-addr")
ip6-address     =                                      6(ip6-h16 ":") ls32
                    /                             "::" 5(ip6-h16 ":") ls32
                    / [                 ip6-h16 ] "::" 4(ip6-h16 ":") ls32
                    / [ *1(ip6-h16 ":") ip6-h16 ] "::" 3(ip6-h16 ":") ls32
                    / [ *2(ip6-h16 ":") ip6-h16 ] "::" 2(ip6-h16 ":") ls32
                    / [ *3(ip6-h16 ":") ip6-h16 ] "::"   ip6-h16 ":"  ls32
                    / [ *4(ip6-h16 ":") ip6-h16 ] "::"                ls32
                    / [ *5(ip6-h16 ":") ip6-h16 ] "::"   ip6-h16
                    / [ *6(ip6-h16 ":") ip6-h16 ] "::"
                =~  (((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::

IPv6-address-literal    =   "IPv6:" ip6-address
                        =~  IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)

Standardized-tag        =   Ldh-str
                        =~  [0-9A-Za-z-]*[0-9A-Za-z]

dcontent        =   %d33-90 / %d94-126
                =~  [!-Z^-~]

General-address-literal =   Standardized-tag ":" 1*dcontent
                        =~  [0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+

address-literal =   "[" ( IPv4-address-literal / IPv6-address-literal / General-address-literal ) "]"
                =~  \[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)]

Mailbox         =   Local-part "@" ( Domain / address-literal )
                =~  ([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)*|\[((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|IPv6:((((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){6}|::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){5}|[0-9A-Fa-f]{0,4}::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){4}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):)?(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){3}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,2}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){2}|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,3}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,4}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,5}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}))?::)|(?!IPv6:)[0-9A-Za-z-]*[0-9A-Za-z]:[!-Z^-~]+)])

ব্যবহারকারীর ইনপুট বৈধতা

একটি সাধারণ ব্যবহারের ক্ষেত্রে ব্যবহারকারীর ইনপুট বৈধতা, উদাহরণস্বরূপ এইচটিএমএল ফর্ম। সেক্ষেত্রে অ্যাড্রেস-লিটারালগুলি অন্তর্ভুক্ত করা এবং হোস্টনামে কমপক্ষে দুটি লেবেল প্রয়োজন। ভিত্তি হিসাবে পূর্ববর্তী বিভাগ থেকে উন্নত আরএফসি 5321 রিজেক্স গ্রহণ করা, ফলাফল প্রকাশ হবে:

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+

আমি স্থানীয় অংশটি আরও সীমাবদ্ধ রাখার প্রস্তাব দিই না, উদাহরণস্বরূপ উদ্ধৃত স্ট্রিংগুলি বাদ দিয়ে, যেহেতু আমরা জানি না যে কোনও হোস্ট কোন ধরণের মেলবক্সের নাম (যেমন "a..b"@example.netবা এমনকি "a b"@example.net) অনুমতি দেয় ।

আমি আক্ষরিক শীর্ষ-স্তরের ডোমেনগুলির তালিকার বিরুদ্ধে এমনকি স্পষ্টভাবে বৈধতা দেওয়ার বা দৈর্ঘ্য-সীমাবদ্ধতার চাপ দেওয়ারও প্রস্তাব দিই না (মনে রাখবেন কীভাবে ".মিউসিয়াম" অবৈধ হয়েছে [a-z]{2,4}) তবে আপনার যদি অবশ্যই তা করতে পারেন:

([-!#-'*+/-9=?A-Z^-~]+(\.[-!#-'*+/-9=?A-Z^-~]+)*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@([0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?\.)*(net|org|com|info|ইত্যাদি ...)

আপনি সুস্পষ্ট শীর্ষ স্তরের ডোমেন বৈধতার পথে নামার সিদ্ধান্ত নিলে আপনার রেজেক্সকে আপ টু ডেট রাখার বিষয়টি নিশ্চিত করুন।

আরও বিবেচনা

ডোমেন অংশে কেবলমাত্র হোস্টের নাম স্বীকার করার পরে (@-সাইন এর পরে), উপরের রেজিক্সরা কেবলমাত্র সর্বোচ্চ লেবেলগুলিকে সর্বাধিক characters৩ টি অক্ষর সহ গ্রহণ করবে। তবে, তারা এই সত্যটি প্রয়োগ করে না যে পুরো হোস্টের নামটি অবশ্যই সর্বাধিক 253 অক্ষর দীর্ঘ হতে হবে (বিন্দু সহ)। যদিও এই সীমাবদ্ধতা কঠোরভাবে এখনও নিয়মিত কথা বলছে, এই নিয়মকে অন্তর্ভুক্ত করে এমন একটি রেজেক্স তৈরি করা সম্ভব হবে না।

আরেকটি বিবেচনা, বিশেষত ইনপুট বৈধতার জন্য রেজিক্সগুলি ব্যবহার করার সময়, ব্যবহারকারীদের প্রতিক্রিয়া। যদি কোনও ব্যবহারকারী কোনও ভুল ঠিকানা প্রবেশ করে তবে একটি সাধারণ "সিনট্যাকটিক্যালি ভুল ঠিকানা" এর চেয়ে কিছুটা বেশি প্রতিক্রিয়া জানানো ভাল লাগবে। "ভ্যানিলা" রেজেক্সেস সহ এটি সম্ভব নয়।

এই দুটি বিবেচনা ঠিকানা ঠিকানা বিশ্লেষণ করে সমাধান করা যেতে পারে। হোস্টের নামের অতিরিক্ত দৈর্ঘ্যের সীমাবদ্ধতা কিছু ক্ষেত্রে অতিরিক্ত পরীক্ষা করে এটি পরীক্ষা করে এবং উভয় এক্সপ্রেশনগুলির সাথে ঠিকানার সাথে মিল রেখেও সমাধান করা যেতে পারে।

এই উত্তরের রেজিক্সগুলির কোনওটিই পারফরম্যান্সের জন্য অনুকূল নয়। পারফরম্যান্স যদি কোনও সমস্যা হয় তবে আপনার (এবং কীভাবে) আপনার পছন্দের রেজেক্সটি অনুকূলিত করা যায় তা দেখতে হবে।


3
পূর্ণ, পরিষ্কার UTF-8- এ অনুমতি দেওয়ার জন্য এবং অন্তর্ভুক্ত করার জন্য আরএফসি 6532 আপডেট করে 5322 । অতিরিক্ত বিবরণ এখানে

উইকিপিডিয়া অনুসারে মনে হয় যে স্থানীয় অংশটি যখন বিন্দুযুক্ত হয় তখন প্রতি অংশে cha৪ টি চর সীমাবদ্ধতা থাকে এবং আরএফসি 5322 ডোমেনের সীমাবদ্ধতার সাথে ব্যাখ্যা করার জন্য বিন্দুযুক্ত স্থানীয় অংশকে বোঝায়। উদাহরণস্বরূপ arbitrary-long-email-address-should-be-invalid-arbitrary-long-email-address-should-be-invalid.and-the-second-group-also-should-not-be-so-long-and-the-second-group-also-should-not-be-so-long@example.comবৈধতা দেওয়া উচিত নয়। আমি প্রথম গ্রুপে "+" চিহ্নগুলি ( {1,64}
জাভি মন্টেরো

মতামতগুলি আকারে সীমাবদ্ধ হওয়ায়, আমি ব্যবহার করার পরিকল্পনা করছি ফলাফলের রেজেজ যা এখানে উত্তরটির শুরুতে এক, স্থানীয় অংশে আকার সীমাবদ্ধ করা, "/" এর আগে একটি ব্যাক-স্ল্যাশ যুক্ত করা পিএইচপি এবং regex101.com এও প্রয়োজনীয় হিসাবে প্রতীক: পিএইচপি আমি ব্যবহার করি:$emailRegex = '/^([-!#-\'*+\/-9=?A-Z^-~]{1,64}(\.[-!#-\'*+\/-9=?A-Z^-~]{1,64})*|"([]!#-[^-~ \t]|(\\[\t -~]))+")@[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?(\.[0-9A-Za-z]([0-9A-Za-z-]{0,61}[0-9A-Za-z])?)+$/';
জাভি মন্টেরো

সতর্কতা: কোনও কারণে, রেন্ডার মার্কডাউন থেকে অনুলিপি করার সময় স্ট্যাকওভারফ্লো লুকানো অক্ষর যুক্ত করে। এটি regex101.com এ অনুলিপি করুন এবং আপনি সেখানে কালো বিন্দু দেখতে পাবেন। আপনাকে সেগুলি মুছে ফেলতে হবে এবং স্ট্রিংটি সংশোধন করতে হবে ... উত্তরে সংহত করা হতে পারে, সেখানে সেগুলি সঠিকভাবে অনুলিপিযোগ্য। অসুবিধার জন্য দুঃখিত. এটি সঠিক উত্তর হিসাবে আমি কোনও নতুন উত্তর যুক্ত করতে চাই না। এছাড়াও আমি সরাসরি সম্পাদনা করতে চাই না যদি না জনগোষ্ঠী মনে করে যে এটি এর মধ্যে সংহত করা উচিত।
জাভি মন্টেরো

জাভির অবদানের জন্য @ নাভি মন্টেরো ধন্যবাদ! স্থানীয় অংশ লেবেলগুলিতে character৪ টি অক্ষরের সীমা উল্লেখ করে কি আপনার কাছে আরএফসির একটি উল্লেখ রয়েছে? যদি তা হয় তবে আমি সানন্দে উত্তরটি সামঞ্জস্য করব।
রিঙ্ক

73

নেটে এটির প্রচুর উদাহরণ রয়েছে (এবং আমি মনে করি এমন একটি এমনকি যা আরএফসিকে পুরোপুরি বৈধ করে দেয় - তবে এটি স্মৃতিটি পরিবেশন করে যদি দশ / শত লাইন দীর্ঘ হয়)। লোকেরা এই ধরণের জিনিসকে বৈধতা দিয়ে চলে যাওয়ার ঝোঁক নেয়। কেন এটির একটি @ এবং কমপক্ষে একটি আছে তা যাচাই করবেন না। এবং কিছু সাধারণ ন্যূনতম দৈর্ঘ্য পূরণ করে। এটি একটি নকল ইমেল প্রবেশ করা তুচ্ছ এবং এখনও যে কোনও বৈধ রেজেক্সের সাথে মেলে। আমি অনুমান করব যে মিথ্যা ধনাত্মকগুলি মিথ্যা নেতিবাচক চেয়ে ভাল।


1
হ্যাঁ, তবে কোন আরএফসি? :) এই [আরএফসি ‐ 5322 – বৈধকরণকারী] ( স্ট্যাকওভারফ্লো.com / প্রশ্নস / ২০১৩৩৩/২ ) কেবল চল্লিশ লাইনের দীর্ঘ।
tchrist

14
ক। এটা দরকারি না. একটি
টিএলডির

1
আরএফসিগুলি গল্পের শেষ নয়: আইসিএনএএনএন
সিঙ্ক্রো

64

কোন অক্ষরগুলি অনুমোদিত তা সিদ্ধান্ত নেওয়ার সময়, দয়া করে আপনার এস্ট্রোপড এবং হাইফেনেটেড বন্ধুদের মনে রাখবেন। এইচআর সিস্টেম থেকে আমার নামটি ব্যবহার করে আমার সংস্থা আমার ইমেল ঠিকানাটি জেনারেট করে এ বিষয়ে আমার কোনও নিয়ন্ত্রণ নেই। এর মধ্যে আমার শেষ নাম অ্যাস্টোস্ট্রোফ রয়েছে। আমার ইমেল ঠিকানা "অবৈধ" হওয়ায় আমাকে কতবার ওয়েবসাইটের সাথে কথাবার্তা থেকে বাধা দেওয়া হয়েছে তা আমি বলতে পারি না।


4
এটি এমন প্রোগ্রামগুলির একটি অতি সাধারণ সমস্যা যা কোনও ব্যক্তির নামে কী এবং কোনটি অনুমোদিত নয় সে সম্পর্কে অনাকাঙ্ক্ষিত ধারণা তৈরি করে। কাউকে এ জাতীয় কোনও অনুমান করা উচিত নয়, প্রাসঙ্গিক আরএফসি (গুলি) যেটি অবশ্যই বলবে তা অবশ্যই গ্রহণ করুন।
tchrist

4
হ্যাঁ. আমি বিশেষত প্রোগ্রামাররা ই-মেইল ঠিকানায় মূলধনপত্র প্রত্যাখ্যানকারীদের বিরুদ্ধে ক্রুদ্ধ হই! বোকা এবং / বা অলস।
ফিলিহো

63

এই রেজেক্সটি পার্লের ইমেল :: বৈধ লাইব্রেরি থেকে। আমি এটি সবচেয়ে নির্ভুল বলে বিশ্বাস করি, এটি 822 টির সাথে মিলে যায়। এবং, এটি ও'রিলি বইয়ের নিয়মিত অভিব্যক্তির উপর ভিত্তি করে:

নিয়মিত এক্সপ্রেশন ( http://www.ora.com/catalog/regexp/ ) তে মাস্টারিংয়ে জেফরি ফ্রেডেলের উদাহরণ ব্যবহার করে নিয়মিত প্রকাশ expression

$RFC822PAT = <<'EOF';
[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\
xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xf
f\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\x
ff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015
"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\
xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80
-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*
)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\
\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\
x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x8
0-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n
\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x
80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^
\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040
\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([
^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\
\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\
x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-
\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()
]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\
x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\04
0\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\
n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\
015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?!
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\
]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\
x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\01
5()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".
\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]
)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^
()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\0
15()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][
^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\
n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\
x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?
:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-
\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015
()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()
]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\0
40)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\
[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\
xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*
)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80
-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x
80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t
]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\
\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])
*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x
80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80
-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015(
)]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\
\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t
]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\0
15()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015
()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(
\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|
\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80
-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()
]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x
80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^
\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040
\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".
\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff
])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\
\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x
80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015
()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\
\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^
(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-
\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\
n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|
\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))
[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff
\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\x
ff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(
?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\
000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\
xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\x
ff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)
*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\x
ff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-
\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)
*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\
]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]
)[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-
\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\x
ff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(
?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80
-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<
>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x8
0-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:
\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]
*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)
*\)[\040\t]*)*)*>)
EOF

14
ও_ও এটি কী করছে তা বোঝার জন্য আপনাকেও একজন রেগেক্স মাস্টার হতে হবে
ক্রিস ম্যাকগ্রা

45

আপনি যেমন পিএইচপি-তে লিখছেন আমি আপনাকে ইমেলগুলির জন্য পিএইচপি বিল্ড-ইন বৈধতা ব্যবহার করার পরামর্শ দিচ্ছি।

filter_var($value, FILTER_VALIDATE_EMAIL)

আপনি যদি 5.3.6 এর চেয়ে কম পিএইচপি-সংস্করণ চালিয়ে যাচ্ছেন তবে দয়া করে এই সমস্যাটি সম্পর্কে সচেতন হন: https://bugs.php.net/bug.php?id=53091

এই বিড-ইন বৈধতা কীভাবে কাজ করে আপনি যদি আরও তথ্য চান তবে এখানে দেখুন: পিএইচপি-র ফিল্টার_ভার FILTER_VALIDATE_EMAIL আসলে কাজ করে?


আমি কী বলতে যাচ্ছিলাম ঠিক সেভাবে একটি ভোট পেয়ে যায়। আইডিএন হ্যান্ডেল করে না তবে পুণ্য কোডে রূপান্তর আগেই এটি সমাধান করে। পিএইচপি> = 5.3 এর জন্য idn_to_ascii () রয়েছে। কোনও ইমেল যাচাই করার জন্য অন্যতম সেরা এবং সহজ উপায়।
টেলর

43

ক্যাল হেন্ডারসন (ফ্লিকার) পিএইচপি-তে পার্সিং ইমেল অ্যাড্রেস নামে একটি নিবন্ধ লিখেছিলেন এবং কীভাবে সঠিক আরএফসি (2) 822-অনুবর্তী ইমেল ঠিকানা পার্সিং করবেন তা দেখায়। আপনি সোর্স কোডটি পিএইচপি , পাইথন এবং রুবিতে পেতে পারেন যা সিসি লাইসেন্স পেয়েছে ।


এটি আমাকে জানিয়েছিল যে a@bবৈধ ছিল
dsdsdsdsdd

1
@dsdsdsd কারণ a@bবৈধ ... এই ক্ষেত্রে bশীর্ষ স্তরের ডোমেন।
rink.attendant.6

42

আমি নিজের নিয়মিত অভিব্যক্তিটি তৈরি করে কখনই বিরক্ত করি না, কারণ সম্ভাবনা হ'ল ইতিমধ্যে আরও ভাল সংস্করণ নিয়ে অন্য কেউ এসেছে। আমি সর্বদা আমার পছন্দ অনুসারে একটি খুঁজে পেতে রেজিগ্লিব ব্যবহার করি।


1
এটি দৈর্ঘ্য এবং সামগ্রীর জন্য পতাকাঙ্কিত করা হয়েছিল, তবে এটি এখনও 41 টি ভোট সহ একটি ভাল অবদান এবং মুছে ফেলা উচিত নয়।
উইল

37

এমন এক নেই যা সত্যই ব্যবহারযোগ্য।
আমি আমার উত্তরে কিছু সমস্যা নিয়ে আলোচনা করব ইমেল ঠিকানা যাচাইয়ের জন্য কোনও পিএইচপি লাইব্রেরি আছে? , এটি ইমেইল ঠিকানার রেজিগক্স স্বীকৃতিতেও আলোচনা করা হয় ?

সংক্ষেপে, একটি একক, ব্যবহারযোগ্য রেজেক্স একটি উপযুক্ত কাজ করার আশা করবেন না। এবং সেরা রেজেক্স সিনট্যাক্সকে বৈধতা দেবে, কোনও ইমেলটির বৈধতা নয় (jhohn@example.com সঠিক তবে এটি সম্ভবত বাউন্স করবে ...)।


আমি ভুল হলে আমাকে সংশোধন করুন তবে আমি বিশ্বাস করি যে পিএইচপি পিসিআরই প্যাটার্ন ব্যবহার করে। যদি তা হয় তবে আপনি অ্যাবিগেলের আরএফসি 5322 প্যাটার্নের অনুরূপ কিছু কারুকাজ করতে সক্ষম হবেন ।
tchrist

@ ক্রিশ্চ: নিশ্চিত নন যে পিসিআরই এই সিনট্যাক্সটি ধরেছে (যা আমি আবিষ্কার করেছি)। যদি তা হয় তবে নিশ্চিত হন না যে পিএইচপি-র পিসিআরই পিসিআরআই-এর এই সংস্করণটি ধরেছে কিনা ... ঠিক আছে, আমি যদি এই সিনট্যাক্সটি সঠিকভাবে বুঝতে পারি তবে আপনি একটি পিইজি পার্সার ব্যবহার করতে পারেন, যাইহোক রেগেক্সের চেয়ে অনেক পরিষ্কার এবং সম্পূর্ণ।
ফিলোহো

পিসিআরই এটি ধরেছে , তবে সম্ভবত পিএইচপি পিসিআরই-র সাথে ধরা পড়ে নি। ☹
tchrist

36

একটি সাধারণ নিয়মিত প্রকাশ যা কমপক্ষে কোনও বৈধ ইমেল ঠিকানা প্রত্যাখ্যান করবে না এমন কোনও কিছুর জন্য অনুসন্ধান করা হবে, তারপরে একটি @ সাইন এবং তারপরে একটি পিরিয়ড এবং কমপক্ষে 2 সামথিংস অনুসরণ করা হবে। এটি কোনও কিছুই প্রত্যাখ্যান করবে না, তবে অনুমানটি পর্যালোচনা করার পরে আমি কোনও ইমেল খুঁজে পাই না যা বৈধ এবং প্রত্যাখ্যানযোগ্য হবে।

ইমেল = ~ /.+@[^@]+\.[^@]{2,}$/


3
এই আমি খুঁজছিলাম ছিল। খুব সীমাবদ্ধ নয়, তবে এটি নিশ্চিত করে যে সেখানে কেবলমাত্র 1 টি @ রয়েছে (যেমন আমরা একটি তালিকা পার্স করছি এবং নিখোঁজ কমা নেই তা নিশ্চিত করতে চাই)। এফওয়াইআই, আপনার বাম দিকে একটি @ থাকতে পারে যদি তা উদ্ধৃতিতে থাকে: Valid_email_add્રેસ , তবে এটি বেশ সামান্য অংশ
জোশ

2
এটি ব্যবহারের পরে, বুঝতে পেরেছিল যে এটি ঠিক কাজ করে না। /^[^@]+@[^@]+\.[^@]{2}[^@]*$/ আসলে 1 @ সাইন জন্য পরীক্ষা করে। আপনার রেজেক্স শেষের দিকে * এর কারণে একাধিক হতে দেবে।
জোশ

1
ঠিক। আমি সমস্ত অবৈধ প্রত্যাখ্যান করার চেষ্টা করছি না, কেবল একটি বৈধ ইমেল ঠিকানা প্রত্যাখ্যান করা থেকে চালিয়ে যান।
স্পিগ

1
এটি ব্যবহার করা আরও ভাল হবে: /^[^@]+@[^@]+\.[^@]{2,4}$/এটি 2 থেকে 4 অ @ অক্ষর দিয়ে শেষ হয়ে গেছে তা নিশ্চিত করে। @ জোশ নির্দেশিত হিসাবে এটি এখন শেষে একটি অতিরিক্ত @ অনুমতি দেয়। তবে আপনি এটিতেও এটি পরিবর্তন করতে পারেন: /^[^@]+@[^@]+\.[^a-z-A-Z]{2,4}$/যেহেতু সমস্ত শীর্ষ স্তরের ডোমেনগুলি জেড অক্ষর। আপনি ভবিষ্যতের পাশাপাশি শীর্ষ স্তরের ডোমেন নামগুলি আরও দীর্ঘতর হতে অনুমতি 4দিয়ে 5বা আরও বেশি প্রতিস্থাপন করতে পারেন ।
ফ্লাই করুন

@ ফ্লাই, কা @ ফু! সঠিক ফেরত। এটা মানদণ্ড দ্বারা, অনুমিত হয়?
সেক্সিবিস্ট

29

আপনি jQuery বৈধকরণ প্লাগইন দ্বারা নিযুক্ত একটি ব্যবহার করতে পারেন:

/^((([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

এটি একটি ভাল কাজ করা বলে মনে হচ্ছে। এটি অনুমতি দিয়েছে: a-b'c_d.e@f-g.hতবে অনুপযুক্ত প্রকরণগুলি যেমন, a-b'c_d.@f-g.hএবংa-b'c_d.e@f-.h
dsdsdsdsd

25

কোনও ইমেল ঠিকানা যাচাই করার জন্য সেরা নিয়মিত প্রকাশের সর্বাধিক ব্যাপক মূল্যায়নের জন্য দয়া করে এই লিঙ্কটি দেখুন; " নিয়মিত অভিব্যক্তি বৈধকরণের ই-মেইল ঠিকানার সাথে তুলনা করা "

রেফারেন্স উদ্দেশ্যে বর্তমান শীর্ষ প্রকাশটি এখানে:

/^([\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

চামচ 16: লিঙ্কটি সত্যই সঠিক নয়। এর বিবৃতি যে ইমেল ঠিকানাগুলি যাচাই করার জন্য কোনও নিখুঁত নিদর্শন থাকতে পারে তা স্পষ্টতই দোষ। আপনি পারেন , তবে আপনাকে নিশ্চিত করতে হবে যে আপনি ঠিক চিঠির নীচে আরএফসি অনুসরণ করেছেন। এবং আপনাকে ডান আরএফসিও বেছে নিতে হবে।
tchrist

স্ট্রিংটি যথাযথভাবে পালাতে ও রূপান্তরিত করার পরেও - "সেরা" এখনই জাভা রেজেক্সের সাথে কাজ করে না।
এরিক চেন

23

অ-লাতিন (চীনা, আরবি, গ্রীক, হিব্রু, সিরিলিক এবং আরও) ডোমেন নামগুলি অদূর ভবিষ্যতে অনুমোদিত হওয়ার কথা উল্লেখ করার দরকার নেই । প্রত্যেককে ব্যবহৃত ইমেল রেজেক্স পরিবর্তন করতে হবে, কারণ এই চরিত্রগুলি অবশ্যই আচ্ছাদিত করা উচিত নয় এবং [a-z]/iনয়\w । তারা সব ব্যর্থ হবে।

সব পরে, সেরা ইমেল ঠিকানা যাচাই করতে পথ এখনও আসলে করার পাঠাতে ঠিকানা যাচাই করতে প্রশ্নে ঠিকানায় একটি ইমেল। যদি ইমেল ঠিকানাটি ব্যবহারকারী প্রমাণীকরণের অংশ (নিবন্ধক / লগইন / ইত্যাদি) হয় তবে আপনি এটি পুরোপুরি ব্যবহারকারীর অ্যাক্টিভেশন সিস্টেমের সাথে একত্রিত করতে পারেন। অর্থাৎ নির্দিষ্ট ইমেল ঠিকানায় একটি অনন্য অ্যাক্টিভেশন কী সহ একটি লিঙ্কযুক্ত ইমেল প্রেরণ করুন এবং যখন ব্যবহারকারী ইমেলটিতে লিঙ্কটি ব্যবহার করে নতুন নির্মিত অ্যাকাউন্টটি সক্রিয় করে তখন লগইন করার অনুমতি দেয়।

যদি রেইজেক্সের উদ্দেশ্যটি কেবলমাত্র ইউআই-তে ব্যবহারকারীকে অবহিত করা হয় যে নির্দিষ্ট ইমেল ঠিকানাটি সঠিক ফর্ম্যাটে দেখাচ্ছে না, তবে নীচের রেজেজের সাথে এটি মূলত মেলে কিনা তা এখনও পরীক্ষা করা ভাল:

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

যে হিসাবে সহজ। পৃথিবীতে কেন আপনি নাম এবং ডোমেনে ব্যবহৃত অক্ষর সম্পর্কে যত্ন নেবেন? কোনও বৈধ ইমেল ঠিকানা প্রবেশ করা ক্লায়েন্টের দায়িত্ব, সার্ভারের নয়। এমনকি যখন ক্লায়েন্টটি সিন্ট্যাক্টিক্যালি বৈধ ইমেল ঠিকানার মতো প্রবেশ aa@bb.ccকরে, এটি গ্যারান্টি দেয় না যে এটি কোনও আইনী ইমেল ঠিকানা। কেউ রেইজেক্স এটি আবরণ করতে পারে না।


4
আমি সম্মত হই যে একটি প্রমাণীকরণ বার্তা প্রেরণ সাধারণত এই ধরণের স্টাফের জন্য সর্বোত্তম উপায়, সিনট্যাক্টিক্যালি সঠিক এবং বৈধ এক নয়। "কনফার্মেশন" এর জন্য যখন আমি আমার ইমেল ঠিকানাটি দু'বার টাইপ করতে প্রস্তুত হলাম তখন আমি হতাশ হয়ে পড়ি যেন আমি কী টাইপ করেছি সেদিকে নজর দিতে পারি না। আমি যাইহোক যাইহোক কেবল প্রথমটিকে দ্বিতীয়টিতে অনুলিপি করি, মনে হয় এটি আরও বেশি ব্যবহৃত হচ্ছে।
পিটটি

একমত! তবে এই রেজেক্সটি আমি বৈধ বলে মনে করি না কারণ এটি উদাহরণের spacesপরে অনুমতি দেয় @.test@test.ca com netউপরের রেজেক্স ব্যবহার করে একটি বৈধ ইমেল বিবেচনা করা হবে যেখানে এটি অবৈধভাবে ফিরে আসবে।
সিবি 4

20

HTML5 এর বৈশিষ্ট প্রস্তাব দেওয়া ইমেল ঠিকানাগুলি যাচাই করার জন্য একটি সহজ Regex:

/^[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])?)*$/

এটি ইচ্ছাকৃতভাবে আরএফসি 5322 মেনে চলে না ।

দ্রষ্টব্য: এই প্রয়োজনীয়তাটি আরএফসি 5322 এর ইচ্ছাকৃত লঙ্ঘন , যা ইমেল ঠিকানাগুলির জন্য একটি সিনট্যাক্স সংজ্ঞায়িত করে যা একই সাথে খুব কঠোর ( চরিত্রের আগে ), খুব অস্পষ্ট ( চরিত্রের পরে ), এবং খুব শিথিল (মন্তব্য, হোয়াইটস্পেসের অক্ষর, ব্যবহারিক ব্যবহারের জন্য এবং বেশিরভাগ ব্যবহারকারীর কাছেই অচেনা শিষ্টাঙ্কে উদ্ধৃত স্ট্রিংগুলি।@@

মোট দৈর্ঘ্য 254 টি অক্ষরে সীমাবদ্ধও হতে পারে, আরএফসি 3696 এরেটা 1690 অনুসারে


সেরা উত্তর! এখানে ডাব্লু 3 সুপারিশের একটি লিঙ্ক দেওয়া হয়েছে: w3.org/TR/html5/forms.html# માન્ય-e-mail- অ্যাড্রেস এই রেজেক্সটি অনেক ব্রাউজার দ্বারা গৃহীত হয়েছে।
রায়ান টেলর

3
এটি উত্তম উত্তর নয়! এই প্যাটার্ন এই বিলকুল অবৈধ ঠিকানা মেলে: invalid@emailaddress। আপনি এটি ব্যবহার করার আগে আমি সাবধানতা এবং অনেক পরীক্ষার অনুরোধ করব!
শেরিডান

@ শেরিডান, আপনি যদি ভাবেন যে এইচটিএমএল 5 টি নিয়ে কোনও সমস্যা আছে আপনি এখানে একটি সমস্যা উত্থাপন করতে পারবেন: github.com/w3c/html/issues
লুনা

এটি স্ট্যাকওভারফ্লো.com/a/8829363 এর চেয়ে বেশি কিছু যোগ করে না এবং এটির সম্পাদনা বা মন্তব্য হিসাবে IMHO আরও ভাল হবে।

উদাহরণস্বরূপ @ লোকালহোস্টটি বৈধ, তবে একটি সত্যিকারের বিশ্ব অ্যাপ্লিকেশনের জন্য আপনি একটি ডোমেন এক্সটেনশন প্রয়োগ করতে চাইতে পারেন, এটি অর্জনের জন্য আপনাকে কেবল চূড়ান্ত * কে + এ পরিবর্তন করতে হবে (প্যাটার্নের সেই অংশটি 0+ থেকে 1+ এ পরিবর্তন করা উচিত) )
মিচ স্কচওয়েল

15

একটি উজ্জ্বল বিক্ষোভের জন্য, নিম্নলিখিত দৈত্যটি বেশ ভাল তবে এখনও সমস্ত সিন্ট্যাক্টিক্যালি বৈধ ইমেল ঠিকানাগুলি সঠিকভাবে সনাক্ত করতে পারে না: এটি চার স্তরের গভীর পর্যন্ত নেস্টেড মন্তব্যগুলিকে স্বীকৃতি দেয়।

এটি কোনও পার্সারের পক্ষে কাজ, তবে কোনও ঠিকানা সিন্টেক্সিকভাবে বৈধ হলেও এটি এখনও সরবরাহযোগ্য হতে পারে না। কখনও কখনও আপনাকে "আরে, তুই, আমাদের-ই দেখুন!" এর পাহাড়ি বিলি পদ্ধতি অবলম্বন করতে হবে!

// derivative of work with the following copyright and license:
// Copyright (c) 2004 Casey West.  All rights reserved.
// This module is free software; you can redistribute it and/or
// modify it under the same terms as Perl itself.

// see http://search.cpan.org/~cwest/Email-Address-1.80/

private static string gibberish = @"
(?-xism:(?:(?-xism:(?-xism:(?-xism:(?-xism:(?-xism:(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+
|\s+)*[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+(?-xism:(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+
|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(
?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?
:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x
0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*<DQ>(?-xism:(?-xism:[
^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D])))+<DQ>(?-xism:(?-xi
sm:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xis
m:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\
]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\
s*)+|\s+)*))+)?(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?
-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:
\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[
^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*<(?-xism:(?-xi
sm:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^(
)\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(
?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))
|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<
>\[\]:;@\,.<DQ>\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]
+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:
(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s
*\)\s*))+)*\s*\)\s*)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?
:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x
0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xi
sm:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*
<DQ>(?-xism:(?-xism:[^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D]
)))+<DQ>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\
]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-x
ism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+
)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))\@(?-xism:(?-xism:(?-xism:(
?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?
-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^
()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s
*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+(
?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+)*)(?-xism:(?-xism:
\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[
^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+)
)|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)
+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:
(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((
?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\
x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*\[(?:\s*(?-xism:(?-x
ism:[^\[\]\\])|(?-xism:\\(?-xism:[^\x0A\x0D])))+)*\s*\](?-xi
sm:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:
\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(
?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+
)*\s*\)\s*)+|\s+)*)))>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-
xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))|(?-xism:(?-x
ism:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^
()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*
(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D])
)|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()
<>\[\]:;@\,.<DQ>\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s
]+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+)
)|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism
:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\
s*\)\s*))+)*\s*\)\s*)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((
?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\
x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-x
ism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)
*<DQ>(?-xism:(?-xism:[^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D
])))+<DQ>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\
\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-
xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)
+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))\@(?-xism:(?-xism:(?-xism:
(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(
?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[
^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\
s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+
(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+)*)(?-xism:(?-xism
:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:
[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+
))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*
)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism
:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\(
(?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A
\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*\[(?:\s*(?-xism:(?-
xism:[^\[\]\\])|(?-xism:\\(?-xism:[^\x0A\x0D])))+)*\s*\](?-x
ism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism
:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:
(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))
+)*\s*\)\s*)+|\s+)*))))(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?
>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:
\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0
D]))|)+)*\s*\)\s*))+)*\s*\)\s*)*)"
  .Replace("<DQ>", "\"")
  .Replace("\t", "")
  .Replace(" ", "")
  .Replace("\r", "")
  .Replace("\n", "");

private static Regex mailbox =
  new Regex(gibberish, RegexOptions.ExplicitCapture); 

12

অফিসিয়াল স্ট্যান্ডার্ড অনুসারে আরএফসি 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])+)\])

আপনি যদি জাভাতে এটি ব্যবহার করতে চান তবে এটি খুব সহজ

import java.util.regex.*;

class regexSample 
{
   public static void main(String args[]) 
   {
      //Input the string for validation
      String email = "xyz@hotmail.com";

      //Set the email pattern string
      Pattern p = Pattern.compile(" (?:[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])+)\\]");

      //Match the given string with the pattern
      Matcher m = p.matcher(email);

      //check whether match is found 
      boolean matchFound = m.matches();

      if (matchFound)
        System.out.println("Valid Email Id.");
      else
        System.out.println("Invalid Email Id.");
   }
}

1
আপনার রেজেক্সে প্রথম বড় অক্ষরটি লিওনার্দো.ডাভিনসি @gmail.com এর অন্তর্ভুক্ত নয় যা কিছু ব্যবহারকারীর জন্য বিরক্তিকর হতে পারে। পরিবর্তে এটি ব্যবহার করুন:(?:[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-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])+)\])
কাবাব ক্রাববি

@ কেবাব ক্র্যাবি ধন্যবাদ, উত্তরটি সম্পাদনা করুন, আমি পরিবর্তনটি গ্রহণ করব।
এজেড_

আমি যদি আপনার উত্তরে সেই পরিবর্তনটি যুক্ত করে থাকি তবে এটি আর আরএফসি 2822 হতে পারে না তাই এটি সঠিক হয় কিনা তা আমি জানি না।
কাবাব ক্রাবি

11

আমি যে পিএইচপি ব্যবহার করি তা এখানে। আমি এই সমাধানটি বেছে নিয়েছি "মিথ্যা ধনাত্মক চেয়ে মিথ্যা ধনাত্মক চেয়ে ভাল" এখানে অন্য একজন মন্তব্যকারী ঘোষণা করেছিলেন এবং আপনার প্রতিক্রিয়া সময় অবধি রাখার সাথে সাথে এবং সার্ভারটি লোড ডাউন করার জন্য ... সেখানে সার্ভারের সংস্থানগুলি নষ্ট করার কোনও দরকার নেই একটি সাধারণ এক্সপ্রেশন যখন এটি সবচেয়ে সাধারণ ব্যবহারকারীর ত্রুটিটি ছড়িয়ে দেবে। আপনি চাইলে পরীক্ষার ইমেল প্রেরণ করে আপনি সর্বদা এটি অনুসরণ করতে পারেন।

function validateEmail($email) {
  return (bool) stripos($email,'@');
}

1
ক) "বর্জ্য সার্ভার রিসোর্সগুলি" অনন্য, তবে আপনি যদি এদিকে ঝুঁকছেন, তবে আপনি জেএসের সাথে এটি ক্লায়েন্টের পক্ষে করতে পারবেন খ) আপনার একটি রেজিস্ট্রেশন মেইল ​​প্রেরণ করার দরকার কী এবং ব্যবহারকারী আমাকে @ ভোভটহেডটকম এ প্রবেশ করে? আপনার "সমাধান" ব্যর্থ হয় এবং আপনি একজন ব্যবহারকারীকে হারান।
জনজহন

ক) জাভাস্ক্রিপ্ট অক্ষম করা থাকলে ব্যর্থ হবে এমন জেএস বৈধতার উপর নির্ভর করা সেরা ধারণার মতো শোনাচ্ছে না (কেবল
বিটিডাব্লু

11

আরএফসি 5322 মান:

ডট-অ্যাটম স্থানীয় অংশ, কোটড-স্ট্রিং লোকাল-পার্ট, অপ্রচলিত (মিশ্রিত বিন্দু-পরমাণু এবং কোটড-স্ট্রিং) স্থানীয় অংশ, ডোমেন নাম ডোমেন, (আইপিভি 4, আইপিভি 6, এবং আইপিভি 4-ম্যাপযুক্ত আইপিভি 6 ঠিকানা) ডোমেন আক্ষরিক ডোমেইন, এবং (নেস্টেড) সিএফডব্লিউএস।

'/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD'

আরএফসি 5321 মান:

ডট-অ্যাটম স্থানীয় অংশ, কোটড-স্ট্রিং লোকাল-পার্ট, ডোমেন নেম ডোমেন এবং (আইপিভি 4, আইপিভি 6, এবং আইপিভি 4-ম্যাপযুক্ত আইপিভি 6 ঠিকানা) ডোমেন আক্ষরিক ডোমেনকে অনুমতি দেয়।

'/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!"?(?>\\\[ -~]|[^"]){65,}"?@)(?>([!#-\'*+\/-9=?^-~-]+)(?>\.(?1))*|"(?>[ !#-\[\]-~]|\\\[ -~])*")@(?!.*[^.]{64,})(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?2)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?3)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?3)(?>:(?3)){0,6})?::(?4)?))|(?>(?>IPv6:(?>(?3)(?>:(?3)){5}:|(?!(?:.*[a-f0-9]:){6,})(?5)?::(?>((?3)(?>:(?3)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?6)){3}))\])$/iD'

বেসিক:

ডট-পরমাণু স্থানীয়-অংশ এবং ডোমেন নাম ডোমেনকে মঞ্জুরি দেয় (টিএলডি সহ কমপক্ষে দুটি ডোমেন নেম লেবেল 2-6 বর্ণমালা অক্ষরে সীমাবদ্ধ থাকে)।

"/^(?!.{255,})(?!.{65,}@)([!#-'*+\/-9=?^-~-]+)(?>\.(?1))*@(?!.*[^.]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?\.){1,126}[a-z]{2,6}$/iD"

শয়তান ভাষা এটি কি ?? আমি একটি /Dপতাকা দেখতে পাচ্ছি , এবং আপনি এটি একক উদ্ধৃতি দিয়ে উদ্ধৃত করেছেন তবুও প্যাটার্নটি সীমাবদ্ধ করতে স্ল্যাশ ব্যবহার করেছেন? এটি পার্ল নয়, এবং এটি পিসিআরই হতে পারে না। সুতরাং এটি কি পিএইচপি? আমি বিশ্বাস করি যে এই তিনটিই পুনরাবৃত্তি পছন্দ করে (?1)
tchrist

এটি পিএইচপিতে রয়েছে, যা পিসিআরই ব্যবহার করে। স্ল্যাশগুলি শুধুমাত্র বিশেষ অক্ষর যেমন বন্ধনী, বর্গাকার বন্ধনী এবং অবশ্যই স্ল্যাশ এবং একক উদ্ধৃতিগুলি সীমিত করতে ব্যবহৃত হয়। / ডি পতাকা, যদি আপনি না জানতেন তবে স্ট্রিংয়ের শেষে যুক্ত হওয়া একটি নতুন লাইন রোধ করা হবে, যা অন্যথায় অনুমোদিত হবে।
মাইকেলরশটন

9

অদ্ভুত যে আপনি 4 টি অক্ষর টিএলডি অনুমতি দিতে পারবেন না। আপনি থেকে মানুষ নিষিদ্ধ করা হয় .info এবং .name , এবং দৈর্ঘ্য সীমাবদ্ধতা স্টপ .travel এবং .museum কিন্তু হ্যাঁ, তারা 2 অক্ষর TLDs এ এবং 3 টি অক্ষর TLDs এ কম সাধারণ।

আপনারও বড় হাতের বর্ণমালা মঞ্জুর করা উচিত। ইমেল সিস্টেমগুলি স্থানীয় অংশ এবং ডোমেন অংশকে স্বাভাবিক করবে।

আপনার ডোমেন অংশের রেগেক্সের জন্য, ডোমেন নাম '-' দিয়ে শুরু হতে পারে এবং '-' দিয়ে শেষ হতে পারে না। ড্যাশ কেবল এর মধ্যেই থাকতে পারে।

আপনি যদি পিয়ার লাইব্রেরি ব্যবহার করেন তবে তাদের মেল ফাংশনটি দেখুন (সঠিক নাম / গ্রন্থাগারটি ভুলে গেছেন)। আপনি একটি ফাংশন কল করে ইমেল ঠিকানা বৈধ করতে পারেন, এবং এটি আরএফসি 822-এর সংজ্ঞা অনুযায়ী ইমেল ঠিকানাটিকে বৈধতা দেয়।


2
@ জোসেফ ইয়ে: আরএফসি 822 কি কিছুটা তারিখের নয়?
tchrist

8
public bool ValidateEmail(string sEmail)
{
    if (sEmail == null)
    {
        return false;
    }

    int nFirstAT = sEmail.IndexOf('@');
    int nLastAT = sEmail.LastIndexOf('@');

    if ((nFirstAT > 0) && (nLastAT == nFirstAT) && (nFirstAT < (sEmail.Length - 1)))
    {
        return (Regex.IsMatch(sEmail, @"^[a-z|0-9|A-Z]*([_][a-z|0-9|A-Z]+)*([.][a-z|0-9|A-Z]+)*([.][a-z|0-9|A-Z]+)*(([_][a-z|0-9|A-Z]+)*)?@[a-z][a-z|0-9|A-Z]*\.([a-z][a-z|0-9|A-Z]*(\.[a-z][a-z|0-9|A-Z]*)?)$"));
    }
    else
    {
        return false;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.