সেরা জাভা ইমেল ঠিকানা বৈধতা পদ্ধতি কি? [বন্ধ]


247

জাভা জন্য ভাল ইমেল ঠিকানা বৈধতা লাইব্রেরি কি? কমন্স ভ্যালিডেটরের কোনও বিকল্প আছে কি?


15
আমি কেবল এটি এখানে রেখে যাব: davidcelis.com/blog/2012/09/06/…
এমপেনকোভ

4
কমন্সের জন্য বর্তমান ইউআরএল: commons.apache.org/proper/commons-omotator/apidocs/org/apache/…
james.garriss

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

1
@ বেনিবোটমা মন্তব্যটি দিয়ে প্রশ্নটি সম্পাদনা করার পরিবর্তে, আপনার যদি এখনও প্রশ্ন থাকে তবে কেন এটি বন্ধ ছিল তা আলোচনা করার জন্য দয়া করে একটি মেটা পোস্ট করুন।
মাচাভিটি

উত্তর:


134

অ্যাপাচি কমন্স সাধারণত একটি শক্ত প্রকল্প হিসাবে পরিচিত। মনে রাখবেন, তবে, আপনি যদি এখনও এটি সত্যিকারের ইমেল নিশ্চিত করতে চান এবং মালিক এটি আপনার সাইটে এটি ব্যবহার করতে চায় তবে আপনাকে ঠিকানায় একটি যাচাইকরণ ইমেল প্রেরণ করতে হবে।

সম্পাদনা : একটি ত্রুটি ছিল যেখানে এটি ডোমেনের উপরে খুব বাধা ছিল, যার ফলে এটি নতুন টিএলডি থেকে বৈধ ইমেলগুলি গ্রহণ করবে না।

এই বাগটি 03 / জানুয়ারী / 15 02:48 এ কমন্স-ভ্যালিডেটর সংস্করণ 1.4.1 এ সমাধান করা হয়েছে


1
আপনার উদ্ধৃত অতিরিক্ত বিটগুলির সাথে আমি একমত, তবে কমন্স বৈধকরণ প্রকল্পের সেই অংশগুলি কী?
ডাফাইমো

2
না, অ্যাপাচি EmailValidatorক্লাস যাচাইয়ের জন্য কোনও ইমেল বার্তা প্রেরণ করে না।
ম্যাথু ফ্ল্যাশেন

3
যদি আপনার ব্যবহারের ক্ষেত্রে কোনও ব্যবহারকারীর দূরবর্তী ইমেল ঠিকানাটি বৈধ করা হয় তবে এই সমাধানটিতে যথেষ্ট ত্রুটি রয়েছে (ইন্টারনেটএড্রেস.ডাওলিয়েট () এর অনুরূপ): ইমেলভালিডেটর ব্যবহারকারী @ [10.9.8.7] কে একটি বৈধ ইমেল ঠিকানা হিসাবে বিবেচনা করে - যা তারা অনুসারে আরএফসি, তবে সম্ভবত ব্যবহারকারী নিবন্ধকরণ / যোগাযোগের ফর্মের জন্য নয়।
zillion1

1
@ জিলিয়ন, এটি অ্যাপাচি কম্মনেস নথিভুক্ত করা হয়েছে: "এই প্রয়োগটি ইমেল ঠিকানায় সমস্ত সম্ভাব্য ত্রুটি ধরার নিশ্চয়তা দেয় না।" এবং আমি বলেছিলাম "এটি সত্যিকারের ইমেল নিশ্চিত করতে" আপনাকে কী করতে হবে। স্থানীয় আইপি সহ ঠিকানাগুলি বিরল পরিবেশে বৈধ হতে পারে।
ম্যাথু ফ্ল্যাশেন

5
অ্যাপাচি কমন্স ইমেলভালিডেটরের একটি গুরুতর অসুবিধা রয়েছে: IDN সমর্থন করে না।
পাইওহেন

261

অফিসিয়াল জাভা ইমেল প্যাকেজ ব্যবহার করা সবচেয়ে সহজ:

public static boolean isValidEmailAddress(String email) {
   boolean result = true;
   try {
      InternetAddress emailAddr = new InternetAddress(email);
      emailAddr.validate();
   } catch (AddressException ex) {
      result = false;
   }
   return result;
}

59
নোট করুন যে ইন্টারনেটএড্রেস.এলডিয়েট () ব্যবহারকারী @ [10.9.8.7] এবং ব্যবহারকারী @ লোকালহোস্টকে বৈধ ইমেল ঠিকানা হিসাবে বিবেচনা করে - যা তারা আরএফসি অনুসারে। যদিও, ব্যবহারের ক্ষেত্রে (ওয়েব ফর্ম) উপর নির্ভর করে, আপনি এগুলি অবৈধ হিসাবে বিবেচনা করতে চাইতে পারেন।
zillion1

8
@ জিলিয়ন 1 যেমনটি বলেছে কেবল বৈধ নয়, তবে ব্লা @ ব্লকের মতো জিনিসগুলিও বৈধ বলে বিবেচিত হয়। সত্যিই সেরা সমাধান না।
দিয়েগো প্লেন্টজ

4
@ নিকোলাসটলি কোট্রেল এটি জাভা, এখানে আমরা ব্যতিক্রম ছুঁড়ে ফেলি এবং ধরি, আমি সত্যিই আপনার
বক্তব্যটি

17
আমি সন্দেহ করি যে ইন্টারনেটএড্রেস কনস্ট্রাক্টরের সাথে হস্তক্ষেপ করা হয়েছে। বা আমার সিস্টেমের সাথে হস্তক্ষেপ করা হয়েছে। বা আরএফসি 822 এর সাথে হস্তক্ষেপ করা হয়েছে। অথবা আমি এখনই কিছুটা ঘুম ব্যবহার করতে পারি। তবে আমি কিছু কোড চেষ্টা করেছি এবং নিম্নলিখিত পাঁচটি স্ট্রিং বৈধ ই-মেইল ঠিকানা হিসাবে সমস্ত পাস করে যদি আপনি সেগুলি ইন্টারনেটএড্রেস কনস্ট্রাক্টরকে প্রদান করেন এবং "স্পষ্টভাবে", সেগুলি বৈধ নয়। এখানে আমরা এখানে যান: ., .com, com., abcএবং 123। এছাড়াও, শীর্ষস্থানীয় বা পিছনে সাদা স্থান যুক্ত করা স্ট্রিংগুলিকে অকার্যকর করে না। তুমি বিচারক হউ!
মার্টিন অ্যান্ডারসন

4
ওম, পনির এটি চালানোর সময় সঠিকভাবে ব্যর্থ হয়। জাভাক্স.মেল লাইব্রেরি কিসের সাথে যুক্ত হচ্ছে ???
অ্যারন ডেভিডসন

91

অন্যান্য জবাব হিসাবে উল্লিখিত হিসাবে অ্যাপাচি কমন্স ভ্যালিডেটর ব্যবহার করা যেতে পারে।

pom.xml:

<dependency>
    <groupId>commons-validator</groupId>
    <artifactId>commons-validator</artifactId>
    <version>1.4.1</version>
</dependency>

build.gradle:

compile 'commons-validator:commons-validator:1.4.1'

আমদানি:

import org.apache.commons.validator.routines.EmailValidator;

কোড:

String email = "myName@example.com";
boolean valid = EmailValidator.getInstance().isValid(email);

এবং স্থানীয় ঠিকানাগুলির অনুমতি দেওয়ার জন্য

boolean allowLocal = true;
boolean valid = EmailValidator.getInstance(allowLocal).isValid(email);

2
অ্যান্ড্রয়েড স্টুডিওতে আপনি আপনার অ্যাপ্লিকেশনটিতে 'কমন্স-ভ্যালিডেটর: কমন্স-ভ্যালিডেটর: 1.4.1' সংকলন যুক্ত করতে পারেন \ বিল্ডড্র্যাডলের নির্ভরতা {}
বেনজিকো 99

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

1
বেনজিকো 99-তে আমার সাথে একই সমস্যা। নির্ভরতা যুক্ত করার পরে, প্রকল্পটি সংকলন করবে না, বলে java.exe শূন্য নয় প্রস্থান কোড 2 দিয়ে শেষ হয়েছে
অমিত

1
অ্যান্ড্রয়েড স্টুডিওতেও আমি ত্রুটি পাচ্ছিলাম। আমি 1.4.1 থেকে 1.5.1 এ পরিবর্তিত হয়েছি এবং এটি কার্যকর হয়!
ম্যাট

1
দ্রষ্টব্য: org.apache.commons.uthorator.routines এ org.apache.commons. লাডিয়েটারে ইমেলযুক্তি ব্যবহারকারীর অবধি বাতিল করা হয়েছে (আমি 1.6 কমন্স ভ্যালিডেটর ব্যবহার করছি)
হোপকিং

71

দেরীতে উত্তর, তবে আমি মনে করি এটি সহজ এবং যোগ্য:

    public boolean isValidEmailAddress(String email) {
           String ePattern = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$";
           java.util.regex.Pattern p = java.util.regex.Pattern.compile(ePattern);
           java.util.regex.Matcher m = p.matcher(email);
           return m.matches();
    }

পরীক্ষার কেস :

এখানে চিত্র বর্ণনা লিখুন

উত্পাদনের উদ্দেশ্যে, ডোমেন নেম বৈধতা নেটওয়ার্ক ভিত্তিক করা উচিত।


40
এটি একটি বেশ নির্মমভাবে সরল বৈধকরণকারী যা আইডিএন সহ বেশিরভাগ আরএফসি বিধি উপেক্ষা করে। আমি যে কোনও উত্পাদন মানের অ্যাপ্লিকেশনটির জন্য এটি পরিষ্কার করতে চাই।
mlaccetti 25'14

1
me@company.co.uk বৈধ হবে না ...
আলেকজান্ডার বুড়াক্যাভিচ

14
আরএফসি দ্বারা আচ্ছাদিত জিনিসগুলির জন্য আপনার নিজস্ব রেজেক্স-ভিত্তিক বৈধকারীর রোল করবেন না।
জোশ গ্লোভার 10 ই

6
আপনি মাঝে মাঝে ফ্ল্যাট টায়ারের আপত্তি না জানায় চাকা পুনর্বিবেচনা ঠিক আছে
dldnh

এটি ভাল তবে সব ক্ষেত্রে নয়।
Andrain

21

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

Pattern pattern = Pattern.compile("^.+@.+\\..+$");
Matcher matcher = pattern.matcher(email);

3
এটি সত্যিই ভাল পয়েন্ট, যে কোনও উপায়ে এই
ইনপুটটিকে

4
কীভাবে এটি "^। + @। + (\\। [^ \\।]] +) + To" পরিবর্তনযোগ্য বিন্দু এড়াতে হবে?
জিঙ্গাং হুয়াং

7

এই প্রশ্নের শেষ পর্যন্ত, তবে: আমি এই ঠিকানায় একটি শ্রেণি বজায় রেখেছি: http://lacinato.com/cm/software/emailrelated/emailaddress

এটি লেস হ্যাজলউডের ক্লাসের উপর ভিত্তি করে তৈরি হয়েছে তবে এতে কয়েকটি উন্নতি এবং কয়েকটি বাগ সংশোধন করা হয়েছে। অ্যাপাচি লাইসেন্স।

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

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

"<bob \" (here) " < (hi there) "bob(the man)smith" (hi) @ (there) example.com (hello) > (again)

কোনও মেল সার্ভার এটির অনুমতি দেয় না, তবে এই শ্রেণিটি এটি বিশ্লেষণ করতে পারে (এবং এটি ব্যবহারযোগ্য ফর্মটিতে আবার লিখতে পারে)।

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

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

লিখিত হিসাবে কোডটির একটি জাভামাইল নির্ভরতা রয়েছে তবে আপনি যদি এটি সরবরাহ করেন এমন ছোটখাটো কার্যকারিতা না চান তবে এটি সরানো সহজ।


1
হাই, আমি এটি ওপেন সোর্স সম্প্রদায়ে জনসাধারণের জন্য গিটহাবে অনুলিপি করেছি। এখন প্রত্যেকেই কোডটিতে মন্তব্য, নথি এবং উন্নতি করতে পারে। github.com/bbottema/email-rfc2822- লাডিয়েটার । আমি লেস দ্বারা পুরানো সংস্করণটি ব্যবহার করতাম, তবে রেইগেক্স
বেনি

7

আমি কেবল ভাবছি কেন @Emailহাইবারনেট ভ্যালিডেটরের অতিরিক্ত বাধাগুলি থেকে কেউ এলো না । যাচাইকারী নিজেই EmailValidator


যদিও অ্যাপাচি কমনের বিকল্প, এটির বাস্তবায়ন বেশিরভাগ রেজেক্স-ভিত্তিক লাইব্রেরির মতোই প্রাথমিক। দস্তাবেজগুলি থেকে: "তবে, যেমন এই নিবন্ধটি আলোচনা করেছে এটি একটি 100% অনুবর্তী ইমেল বৈধকারক বাস্তবায়নের জন্য প্রয়োজনীয় ব্যবহারিক নয়"। আমি জানি কেবলমাত্র রেইজেক্স ভিত্তিক বিস্তৃত বৈধতা প্রদানকারী হ'ল ইমেল-আরএফসি 2822-ভ্যালিডেটর এবং অন্যথায় ইমেলভিডিয়েটার 4 জে আশাবাদী বলে মনে হচ্ছে।
বেনি বোত্তেমা

5

লেস হ্যাজলউড জাভা নিয়মিত অভিব্যক্তি ব্যবহার করে একটি খুব পুঙ্খানুপুঙ্খ আরএফসি 2822 কমপ্লায়েন্ট ইমেল বৈধ লেখক শ্রেণি লিখেছেন। আপনি এটি http://www.leshazlewood.com/?p=23 এ খুঁজে পেতে পারেন । তবে, এর সম্পূর্ণতা (বা জাভা আরই বাস্তবায়ন) অদক্ষতার দিকে পরিচালিত করে - দীর্ঘ ঠিকানাগুলির জন্য পার্সিং বার সম্পর্কে মন্তব্যগুলি পড়ুন।


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

এটি একটি পুরানো লাইব্রেরি এবং শেষ পর্যন্ত ইমেল-rfc2822- বৈধকরণকারী দ্বারা দুবার বরখাস্ত করা হয়েছে । যদিও এটি এখনও সমস্ত আধুনিক প্রয়োজনের সাথে খাপ খায়, এটি এখনও লুকানো পারফরম্যান্স বাগের ঝুঁকিতে থাকে (এবং নতুন আরএফসি স্পেসের সীমিত পরিবর্তনগুলিকে সমর্থন করে না)।
বেনি বোটেমা

3

আমি জেনড_ভালিডেটর_মাইলে কিছু কোড পোর্ট করেছি:

@FacesValidator("emailValidator")
public class EmailAddressValidator implements Validator {

    private String localPart;
    private String hostName;
    private boolean domain = true;

    Locale locale;
    ResourceBundle bundle;

    private List<FacesMessage> messages = new ArrayList<FacesMessage>();

    private HostnameValidator hostnameValidator;

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        setOptions(component);
        String email    = (String) value;
        boolean result  = true;
        Pattern pattern = Pattern.compile("^(.+)@([^@]+[^.])$");
        Matcher matcher = pattern.matcher(email);

        locale = context.getViewRoot().getLocale();
        bundle = ResourceBundle.getBundle("com.myapp.resources.validationMessages", locale);

        boolean length = true;
        boolean local  = true;

        if (matcher.find()) {
            localPart   = matcher.group(1);
            hostName    = matcher.group(2);

            if (localPart.length() > 64 || hostName.length() > 255) {
                length          = false;
                addMessage("enterValidEmail", "email.AddressLengthExceeded");
            } 

            if (domain == true) {
                hostnameValidator = new HostnameValidator();
                hostnameValidator.validate(context, component, hostName);
            }

            local = validateLocalPart();

            if (local && length) {
                result = true;
            } else {
                result = false;
            }

        } else {
            result          = false;
            addMessage("enterValidEmail", "invalidEmailAddress");
        }

        if (result == false) {
            throw new ValidatorException(messages);
        }

    }

    private boolean validateLocalPart() {
        // First try to match the local part on the common dot-atom format
        boolean result = false;

        // Dot-atom characters are: 1*atext *("." 1*atext)
        // atext: ALPHA / DIGIT / and "!", "#", "$", "%", "&", "'", "*",
        //        "+", "-", "/", "=", "?", "^", "_", "`", "{", "|", "}", "~"
        String atext = "a-zA-Z0-9\\u0021\\u0023\\u0024\\u0025\\u0026\\u0027\\u002a"
                + "\\u002b\\u002d\\u002f\\u003d\\u003f\\u005e\\u005f\\u0060\\u007b"
                + "\\u007c\\u007d\\u007e";
        Pattern regex = Pattern.compile("^["+atext+"]+(\\u002e+["+atext+"]+)*$");
        Matcher matcher = regex.matcher(localPart);
        if (matcher.find()) {
            result = true;
        } else {
            // Try quoted string format

            // Quoted-string characters are: DQUOTE *([FWS] qtext/quoted-pair) [FWS] DQUOTE
            // qtext: Non white space controls, and the rest of the US-ASCII characters not
            //   including "\" or the quote character
            String noWsCtl = "\\u0001-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f";
            String qText = noWsCtl + "\\u0021\\u0023-\\u005b\\u005d-\\u007e";
            String ws = "\\u0020\\u0009";

            regex = Pattern.compile("^\\u0022(["+ws+qText+"])*["+ws+"]?\\u0022$");
            matcher = regex.matcher(localPart);
            if (matcher.find()) {
                result = true;
            } else {
                addMessage("enterValidEmail", "email.AddressDotAtom");
                addMessage("enterValidEmail", "email.AddressQuotedString");
                addMessage("enterValidEmail", "email.AddressInvalidLocalPart");
            }
        }

        return result;
    }

    private void addMessage(String detail, String summary) {
        String detailMsg = bundle.getString(detail);
        String summaryMsg = bundle.getString(summary);
        messages.add(new FacesMessage(FacesMessage.SEVERITY_ERROR, summaryMsg, detailMsg));
    }

    private void setOptions(UIComponent component) {
        Boolean domainOption = Boolean.valueOf((String) component.getAttributes().get("domain"));
        //domain = (domainOption == null) ? true : domainOption.booleanValue();
    }
}

হোস্টনাম বৈধকারক হিসাবে নিম্নলিখিত:

@FacesValidator("hostNameValidator")
public class HostnameValidator implements Validator {

    private Locale locale;
    private ResourceBundle bundle;
    private List<FacesMessage> messages;
    private boolean checkTld = true;
    private boolean allowLocal = false;
    private boolean allowDNS = true;
    private String tld;
    private String[] validTlds = {"ac", "ad", "ae", "aero", "af", "ag", "ai",
        "al", "am", "an", "ao", "aq", "ar", "arpa", "as", "asia", "at", "au",
        "aw", "ax", "az", "ba", "bb", "bd", "be", "bf", "bg", "bh", "bi", "biz",
        "bj", "bm", "bn", "bo", "br", "bs", "bt", "bv", "bw", "by", "bz", "ca",
        "cat", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co",
        "com", "coop", "cr", "cu", "cv", "cx", "cy", "cz", "de", "dj", "dk",
        "dm", "do", "dz", "ec", "edu", "ee", "eg", "er", "es", "et", "eu", "fi",
        "fj", "fk", "fm", "fo", "fr", "ga", "gb", "gd", "ge", "gf", "gg", "gh",
        "gi", "gl", "gm", "gn", "gov", "gp", "gq", "gr", "gs", "gt", "gu", "gw",
        "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id", "ie", "il", "im", "in",
        "info", "int", "io", "iq", "ir", "is", "it", "je", "jm", "jo", "jobs",
        "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", "ky", "kz",
        "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", "ly", "ma",
        "mc", "md", "me", "mg", "mh", "mil", "mk", "ml", "mm", "mn", "mo",
        "mobi", "mp", "mq", "mr", "ms", "mt", "mu", "museum", "mv", "mw", "mx",
        "my", "mz", "na", "name", "nc", "ne", "net", "nf", "ng", "ni", "nl",
        "no", "np", "nr", "nu", "nz", "om", "org", "pa", "pe", "pf", "pg", "ph",
        "pk", "pl", "pm", "pn", "pr", "pro", "ps", "pt", "pw", "py", "qa", "re",
        "ro", "rs", "ru", "rw", "sa", "sb", "sc", "sd", "se", "sg", "sh", "si",
        "sj", "sk", "sl", "sm", "sn", "so", "sr", "st", "su", "sv", "sy", "sz",
        "tc", "td", "tel", "tf", "tg", "th", "tj", "tk", "tl", "tm", "tn", "to",
        "tp", "tr", "travel", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "um",
        "us", "uy", "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws",
        "ye", "yt", "yu", "za", "zm", "zw"};
    private Map<String, Map<Integer, Integer>> idnLength;

    private void init() {
        Map<Integer, Integer> biz = new HashMap<Integer, Integer>();
        biz.put(5, 17);
        biz.put(11, 15);
        biz.put(12, 20);

        Map<Integer, Integer> cn = new HashMap<Integer, Integer>();
        cn.put(1, 20);

        Map<Integer, Integer> com = new HashMap<Integer, Integer>();
        com.put(3, 17);
        com.put(5, 20);

        Map<Integer, Integer> hk = new HashMap<Integer, Integer>();
        hk.put(1, 15);

        Map<Integer, Integer> info = new HashMap<Integer, Integer>();
        info.put(4, 17);

        Map<Integer, Integer> kr = new HashMap<Integer, Integer>();
        kr.put(1, 17);

        Map<Integer, Integer> net = new HashMap<Integer, Integer>();
        net.put(3, 17);
        net.put(5, 20);

        Map<Integer, Integer> org = new HashMap<Integer, Integer>();
        org.put(6, 17);

        Map<Integer, Integer> tw = new HashMap<Integer, Integer>();
        tw.put(1, 20);

        Map<Integer, Integer> idn1 = new HashMap<Integer, Integer>();
        idn1.put(1, 20);

        Map<Integer, Integer> idn2 = new HashMap<Integer, Integer>();
        idn2.put(1, 20);

        Map<Integer, Integer> idn3 = new HashMap<Integer, Integer>();
        idn3.put(1, 20);

        Map<Integer, Integer> idn4 = new HashMap<Integer, Integer>();
        idn4.put(1, 20);

        idnLength = new HashMap<String, Map<Integer, Integer>>();

        idnLength.put("BIZ", biz);
        idnLength.put("CN", cn);
        idnLength.put("COM", com);
        idnLength.put("HK", hk);
        idnLength.put("INFO", info);
        idnLength.put("KR", kr);
        idnLength.put("NET", net);
        idnLength.put("ORG", org);
        idnLength.put("TW", tw);
        idnLength.put("ایران", idn1);
        idnLength.put("中国", idn2);
        idnLength.put("公司", idn3);
        idnLength.put("网络", idn4);

        messages = new ArrayList<FacesMessage>();
    }

    public HostnameValidator() {
        init();
    }

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        String hostName = (String) value;

        locale = context.getViewRoot().getLocale();
        bundle = ResourceBundle.getBundle("com.myapp.resources.validationMessages", locale);

        Pattern ipPattern = Pattern.compile("^[0-9a-f:\\.]*$", Pattern.CASE_INSENSITIVE);
        Matcher ipMatcher = ipPattern.matcher(hostName);
        if (ipMatcher.find()) {
            addMessage("hostname.IpAddressNotAllowed");
            throw new ValidatorException(messages);
        }

        boolean result = false;

        // removes last dot (.) from hostname 
        hostName = hostName.replaceAll("(\\.)+$", "");
        String[] domainParts = hostName.split("\\.");

        boolean status = false;

        // Check input against DNS hostname schema
        if ((domainParts.length > 1) && (hostName.length() > 4) && (hostName.length() < 255)) {
            status = false;

            dowhile:
            do {
                // First check TLD
                int lastIndex = domainParts.length - 1;
                String domainEnding = domainParts[lastIndex];
                Pattern tldRegex = Pattern.compile("([^.]{2,10})", Pattern.CASE_INSENSITIVE);
                Matcher tldMatcher = tldRegex.matcher(domainEnding);
                if (tldMatcher.find() || domainEnding.equals("ایران")
                        || domainEnding.equals("中国")
                        || domainEnding.equals("公司")
                        || domainEnding.equals("网络")) {



                    // Hostname characters are: *(label dot)(label dot label); max 254 chars
                    // label: id-prefix [*ldh{61} id-prefix]; max 63 chars
                    // id-prefix: alpha / digit
                    // ldh: alpha / digit / dash

                    // Match TLD against known list
                    tld = (String) tldMatcher.group(1).toLowerCase().trim();
                    if (checkTld == true) {
                        boolean foundTld = false;
                        for (int i = 0; i < validTlds.length; i++) {
                            if (tld.equals(validTlds[i])) {
                                foundTld = true;
                            }
                        }

                        if (foundTld == false) {
                            status = false;
                            addMessage("hostname.UnknownTld");
                            break dowhile;
                        }
                    }

                    /**
                     * Match against IDN hostnames
                     * Note: Keep label regex short to avoid issues with long patterns when matching IDN hostnames
                     */
                    List<String> regexChars = getIdnRegexChars();

                    // Check each hostname part
                    int check = 0;
                    for (String domainPart : domainParts) {
                        // Decode Punycode domainnames to IDN
                        if (domainPart.indexOf("xn--") == 0) {
                            domainPart = decodePunycode(domainPart.substring(4));
                        }

                        // Check dash (-) does not start, end or appear in 3rd and 4th positions
                        if (domainPart.indexOf("-") == 0
                                || (domainPart.length() > 2 && domainPart.indexOf("-", 2) == 2 && domainPart.indexOf("-", 3) == 3)
                                || (domainPart.indexOf("-") == (domainPart.length() - 1))) {
                            status = false;
                            addMessage("hostname.DashCharacter");
                            break dowhile;
                        }

                        // Check each domain part
                        boolean checked = false;

                        for (int key = 0; key < regexChars.size(); key++) {
                            String regexChar = regexChars.get(key);
                            Pattern regex = Pattern.compile(regexChar);
                            Matcher regexMatcher = regex.matcher(domainPart);
                            status = regexMatcher.find();
                            if (status) {
                                int length = 63;

                                if (idnLength.containsKey(tld.toUpperCase())
                                        && idnLength.get(tld.toUpperCase()).containsKey(key)) {
                                    length = idnLength.get(tld.toUpperCase()).get(key);
                                }

                                int utf8Length;
                                try {
                                    utf8Length = domainPart.getBytes("UTF8").length;
                                    if (utf8Length > length) {
                                        addMessage("hostname.InvalidHostname");
                                    } else {
                                        checked = true;
                                        break;
                                    }
                                } catch (UnsupportedEncodingException ex) {
                                    Logger.getLogger(HostnameValidator.class.getName()).log(Level.SEVERE, null, ex);
                                }


                            }
                        }


                        if (checked) {
                            ++check;
                        }
                    }

                    // If one of the labels doesn't match, the hostname is invalid
                    if (check != domainParts.length) {
                        status = false;
                        addMessage("hostname.InvalidHostnameSchema");

                    }
                } else {
                    // Hostname not long enough
                    status = false;
                    addMessage("hostname.UndecipherableTld");
                }

            } while (false);

            if (status == true && allowDNS) {
                result = true;
            }

        } else if (allowDNS == true) {
            addMessage("hostname.InvalidHostname");
            throw new ValidatorException(messages);
        }

        // Check input against local network name schema;
        Pattern regexLocal = Pattern.compile("^(([a-zA-Z0-9\\x2d]{1,63}\\x2e)*[a-zA-Z0-9\\x2d]{1,63}){1,254}$", Pattern.CASE_INSENSITIVE);
        boolean checkLocal = regexLocal.matcher(hostName).find();
        if (allowLocal && !status) {
            if (checkLocal) {
                result = true;
            } else {
                // If the input does not pass as a local network name, add a message
                result = false;
                addMessage("hostname.InvalidLocalName");
            }
        }


        // If local network names are not allowed, add a message
        if (checkLocal && !allowLocal && !status) {
            result = false;
            addMessage("hostname.LocalNameNotAllowed");
        }

        if (result == false) {
            throw new ValidatorException(messages);
        }

    }

    private void addMessage(String msg) {
        String bundlMsg = bundle.getString(msg);
        messages.add(new FacesMessage(FacesMessage.SEVERITY_ERROR, bundlMsg, bundlMsg));
    }

    /**
     * Returns a list of regex patterns for the matched TLD
     * @param tld
     * @return 
     */
    private List<String> getIdnRegexChars() {
        List<String> regexChars = new ArrayList<String>();
        regexChars.add("^[a-z0-9\\x2d]{1,63}$");
        Document doc = null;
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);

        try {
            InputStream validIdns = getClass().getClassLoader().getResourceAsStream("com/myapp/resources/validIDNs_1.xml");
            DocumentBuilder builder = factory.newDocumentBuilder();
            doc = builder.parse(validIdns);
            doc.getDocumentElement().normalize();
        } catch (SAXException ex) {
            Logger.getLogger(HostnameValidator.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(HostnameValidator.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(HostnameValidator.class.getName()).log(Level.SEVERE, null, ex);
        }

        // prepare XPath
        XPath xpath = XPathFactory.newInstance().newXPath();

        NodeList nodes = null;
        String xpathRoute = "//idn[tld=\'" + tld.toUpperCase() + "\']/pattern/text()";

        try {
            XPathExpression expr;
            expr = xpath.compile(xpathRoute);
            Object res = expr.evaluate(doc, XPathConstants.NODESET);
            nodes = (NodeList) res;
        } catch (XPathExpressionException ex) {
            Logger.getLogger(HostnameValidator.class.getName()).log(Level.SEVERE, null, ex);
        }


        for (int i = 0; i < nodes.getLength(); i++) {
            regexChars.add(nodes.item(i).getNodeValue());
        }

        return regexChars;
    }

    /**
     * Decode Punycode string
     * @param encoded
     * @return 
         */
    private String decodePunycode(String encoded) {
        Pattern regex = Pattern.compile("([^a-z0-9\\x2d]{1,10})", Pattern.CASE_INSENSITIVE);
        Matcher matcher = regex.matcher(encoded);
        boolean found = matcher.find();

        if (encoded.isEmpty() || found) {
            // no punycode encoded string, return as is
            addMessage("hostname.CannotDecodePunycode");
            throw new ValidatorException(messages);
        }

        int separator = encoded.lastIndexOf("-");
            List<Integer> decoded = new ArrayList<Integer>();
        if (separator > 0) {
            for (int x = 0; x < separator; ++x) {
                decoded.add((int) encoded.charAt(x));
            }
        } else {
            addMessage("hostname.CannotDecodePunycode");
            throw new ValidatorException(messages);
        }

        int lengthd = decoded.size();
        int lengthe = encoded.length();

        // decoding
        boolean init = true;
        int base = 72;
        int index = 0;
        int ch = 0x80;

        int indexeStart = (separator == 1) ? (separator + 1) : 0;
        for (int indexe = indexeStart; indexe < lengthe; ++lengthd) {
            int oldIndex = index;
            int pos = 1;
            for (int key = 36; true; key += 36) {
                int hex = (int) encoded.charAt(indexe++);
                int digit = (hex - 48 < 10) ? hex - 22
                        : ((hex - 65 < 26) ? hex - 65
                        : ((hex - 97 < 26) ? hex - 97
                        : 36));

                index += digit * pos;
                int tag = (key <= base) ? 1 : ((key >= base + 26) ? 26 : (key - base));
                if (digit < tag) {
                    break;
                }
                pos = (int) (pos * (36 - tag));
            }
            int delta = (int) (init ? ((index - oldIndex) / 700) : ((index - oldIndex) / 2));
            delta += (int) (delta / (lengthd + 1));
            int key;
            for (key = 0; delta > 910; key += 36) {
                delta = (int) (delta / 35);
            }
            base = (int) (key + 36 * delta / (delta + 38));
            init = false;
            ch += (int) (index / (lengthd + 1));
            index %= (lengthd + 1);
            if (lengthd > 0) {
                for (int i = lengthd; i > index; i--) {
                    decoded.set(i, decoded.get(i - 1));
                }
            }

            decoded.set(index++, ch);
        }

        // convert decoded ucs4 to utf8 string
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < decoded.size(); i++) {
            int value = decoded.get(i);
            if (value < 128) {
                sb.append((char) value);
            } else if (value < (1 << 11)) {
                sb.append((char) (192 + (value >> 6)));
                sb.append((char) (128 + (value & 63)));
            } else if (value < (1 << 16)) {
                sb.append((char) (224 + (value >> 12)));
                sb.append((char) (128 + ((value >> 6) & 63)));
                sb.append((char) (128 + (value & 63)));
            } else if (value < (1 << 21)) {
                sb.append((char) (240 + (value >> 18)));
                sb.append((char) (128 + ((value >> 12) & 63)));
                sb.append((char) (128 + ((value >> 6) & 63)));
                sb.append((char) (128 + (value & 63)));
            } else {
                addMessage("hostname.CannotDecodePunycode");
                throw new ValidatorException(messages);
            }
        }

        return sb.toString();

    }

    /**
     * Eliminates empty values from input array
     * @param data
     * @return 
     */
    private String[] verifyArray(String[] data) {
        List<String> result = new ArrayList<String>();
        for (String s : data) {
            if (!s.equals("")) {
                result.add(s);
            }
        }

        return result.toArray(new String[result.size()]);
    }
}

এবং বিভিন্ন টিএলডিএসের জন্য রেগেক্স প্যাটার্ন সহ একটি বৈধ আইডিএনএসএক্সএমএল (অন্তর্ভুক্ত করার পক্ষে খুব বড় :)

<idnlist>
    <idn>
        <tld>AC</tld>
        <pattern>^[\u002d0-9a-zà-öø-ÿāăąćĉċčďđēėęěĝġģĥħīįĵķĺļľŀłńņňŋőœŕŗřśŝşšţťŧūŭůűųŵŷźżž]{1,63}$</pattern>
    </idn>
    <idn>
        <tld>AR</tld>
        <pattern>^[\u002d0-9a-zà-ãç-êìíñ-õü]{1,63}$</pattern>
    </idn>
    <idn>
        <tld>AS</tld>
        <pattern>/^[\u002d0-9a-zà-öø-ÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźż]{1,63}$</pattern>
    </idn>
    <idn>
        <tld>AT</tld>
        <pattern>/^[\u002d0-9a-zà-öø-ÿœšž]{1,63}$</pattern>
    </idn>
    <idn>
        <tld>BIZ</tld>
        <pattern>^[\u002d0-9a-zäåæéöøü]{1,63}$</pattern>
        <pattern>^[\u002d0-9a-záéíñóúü]{1,63}$</pattern>
        <pattern>^[\u002d0-9a-záéíóöúüőű]{1,63}$</pattern>
    </id>
</idlist>

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

3
public class Validations {

    private Pattern regexPattern;
    private Matcher regMatcher;

    public String validateEmailAddress(String emailAddress) {

        regexPattern = Pattern.compile("^[(a-zA-Z-0-9-\\_\\+\\.)]+@[(a-z-A-z)]+\\.[(a-zA-z)]{2,3}$");
        regMatcher   = regexPattern.matcher(emailAddress);
        if(regMatcher.matches()) {
            return "Valid Email Address";
        } else {
            return "Invalid Email Address";
        }
    }

    public String validateMobileNumber(String mobileNumber) {
        regexPattern = Pattern.compile("^\\+[0-9]{2,3}+-[0-9]{10}$");
        regMatcher   = regexPattern.matcher(mobileNumber);
        if(regMatcher.matches()) {
            return "Valid Mobile Number";
        } else {
            return "Invalid Mobile Number";
        }
    }

    public static void main(String[] args) {

        String emailAddress = "suryaprakash.pisay@gmail.com";
        String mobileNumber = "+91-9986571622";
        Validations validations = new Validations();
        System.out.println(validations.validateEmailAddress(emailAddress));
        System.out.println(validations.validateMobileNumber(mobileNumber));
    }
}

2

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


2

যদিও অ্যাপাচি কমনের অনেক বিকল্প রয়েছে, তবে তাদের প্রয়োগগুলি সর্বোত্তমভাবে প্রাথমিক (যেমন অ্যাপাচি কমন্সের প্রয়োগ) হিসাবে) এবং এমনকি অন্য ক্ষেত্রে মৃত ভুলও হতে পারে

আমি তথাকথিত সাধারণ 'অ-নিষেধাজ্ঞামূলক' রেজেক্স থেকেও দূরে থাকতাম; এখানে এমন কোন জিনিস নেই. উদাহরণস্বরূপ @ প্রসঙ্গের উপর নির্ভর করে @ কে একাধিকবার অনুমতি দেওয়া হয়েছে , আপনি কীভাবে জানবেন যে সেখানে প্রয়োজনীয় একটি রয়েছে? ইমেলটি বৈধ হওয়া উচিত যদিও সিম্পল রেজেক্স এটি বুঝতে পারবেন না। আরও জটিল যে কোনও কিছুই ত্রুটি-প্রবণ হয়ে যায় বা লুকানো পারফরম্যান্স হত্যাকারীদের ধারণ করে । আপনি কিভাবে ভালো কিছু বজায় রাখা করতে যাচ্ছি এই ?

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

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

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


1

আপনি কী যাচাই করতে চান? ইমেল ঠিকানা?

ইমেল ঠিকানাটি কেবল এটির ফর্ম্যাট কনফর্মেন্সের জন্য পরীক্ষা করা যায়। মানটি দেখুন: আরএফসি 2822 । এটি করার সর্বোত্তম উপায় হ'ল একটি নিয়মিত প্রকাশ। কোনও ইমেল না প্রেরণে আসলেই উপস্থিত কিনা তা আপনি কখনই জানতে পারবেন না।

আমি কমন্স ভ্যালিডেটর চেক করেছি। এটিতে একটি org.apache.commons.ediaator.EmailValidator শ্রেণি রয়েছে। একটি ভাল সূচনা পয়েন্ট বলে মনে হচ্ছে।


আমি নিশ্চিত নই যে রেজেক্স এটি করার সর্বোত্তম উপায়, আপনি যদি চিঠিতে
আরএফসিটি

@ ব্যবহারকারীর সাথে একমত 2813274, আপনি একটি সঠিক লেক্সার চান, স্প্যাগেটি রেজিেক্স না।
বেনি বোটেমা

1

বর্তমান অ্যাপাচি কমন্স ভ্যালিডেটর সংস্করণটি 1.3.1

যা শ্রেণি যাচাই করে তা হল org.apache.commons.ediaator.EmailValidator ator এটা তোলে org.apache.oro.text.perl.Perl5Util জন্য একটি ইম্পোর্ট হয়েছে যা অবসরপ্রাপ্ত থেকে জাকার্তা Oro প্রকল্পের

বিটিডাব্লু, আমি খুঁজে পেয়েছি যে এখানে একটি 1.4 সংস্করণ রয়েছে, এখানে এপিআই ডক্স রয়েছে । উপর সাইট এটি বলছে: "শেষ প্রকাশের: 05 মার্চ 2008 | সংস্করণ: 1.4-স্ন্যাপশট", কিন্তু যে চূড়ান্ত নয়। নিজেকে তৈরি করার একমাত্র উপায় (তবে এটি স্ন্যাপশট, রিলিজ নয়) এবং ব্যবহার করুন বা এখান থেকে ডাউনলোড করুন । এর অর্থ 1.4 টি তিন বছরের জন্য চূড়ান্ত করা হয়নি (২০০৮-২০১১)। এটি আপাচি স্টাইলে নয়। আমি আরও ভাল বিকল্পের সন্ধান করছি, তবে একটি খুব কার্যকর গৃহীত হয়েছে তা খুঁজে পেলাম না। আমি এমন কিছু ব্যবহার করতে চাই যা ভালভাবে পরীক্ষিত হয়, কোনও বাগ আঘাত করতে চাই না।


১.৪ এসএনএপশট-এর জন্য জাকার্তা ওআরও প্রয়োজন। অ্যাপাচি কমন্স ভ্যালিডেটর আমার পক্ষে ব্যবহারযোগ্য নয়।
কুয়াশা

অবশেষে ডাঃভেটকে বেছে নিয়েছেন। Cumpanasu গিল্ডার এর সমাধান: mkyong.com/regular-expressions/...
কুয়াশা

1
আমি সম্মত হলাম যে অ্যাপাচি কমন্সটির বৈধকরণকারীটি ভাল কাজ করে তবে আমি এটি বেশ ধীর বলে মনে করি - কল প্রতি 3 এমএসের বেশি।
নিক কোটারেল

পারফরম্যান্স আমার পক্ষে তেমন গুরুত্বপূর্ণ নয়।
কুয়াশা

বর্তমান ট্রাঙ্ক এসএনএপিএসএইচটি (এখনকার হিসাবে এসভিএন আরইভি 1227719) এর আর ওওর মতো কোনও বাহ্যিক নির্ভরতা নেই - আপনার আর পুরো বৈধতা মডিউলটির প্রয়োজন নেই - চার শ্রেণি org.apache.commons.ediaator.routines.EmailValidator, InetAddressValidator, DomainValidator এবং RegexValidator একা দাঁড়ানো সক্ষম
Jörg

0

আপনি দৈর্ঘ্যের জন্যও দেখতে চাইতে পারেন - ইমেলগুলি সর্বাধিক 254 অক্ষরের দীর্ঘ। আমি অ্যাপাচি কমন্স যাচাইকারী ব্যবহার করি এবং এটি এটি পরীক্ষা করে না।


জন্য RFC 2821 প্রজাতি (অধ্যায় 4.5.3.1) একটি নির্দিষ্ট করে local-part64 দৈর্ঘ্য এবং একটি domain255 দৈর্ঘ্য (। তারা আর অন্যান্য সফটওয়্যার দ্বারা বাতিল করা হতে পারে অনুমোদিত হয় না)
sarnold

-2

এটি করার মতো কোনও নিখুঁত গ্রন্থাগার বা উপায় রয়েছে বলে মনে হয় না, যদি না আপনাকে ইমেল ঠিকানায় ইমেল প্রেরণ এবং প্রতিক্রিয়াটির জন্য অপেক্ষা করতে হয় (যদিও এটি কোনও বিকল্প হতে পারে না)। আমি এখান থেকে একটি পরামর্শ ব্যবহার করে শেষ করেছিলাম http://blog.logichigh.com/2010/09/02/ માન્યating -an- e -mail- address/ এবং কোডটি সামঞ্জস্য করে যাতে এটি জাভাতে কাজ করবে।

public static boolean isValidEmailAddress(String email) {
    boolean stricterFilter = true; 
    String stricterFilterString = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    String laxString = ".+@.+\\.[A-Za-z]{2}[A-Za-z]*";
    String emailRegex = stricterFilter ? stricterFilterString : laxString;
    java.util.regex.Pattern p = java.util.regex.Pattern.compile(emailRegex);
    java.util.regex.Matcher m = p.matcher(email);
    return m.matches();
}

-2

এটি সেরা পদ্ধতি:

public static boolean isValidEmail(String enteredEmail){
        String EMAIL_REGIX = "^[\\\\w!#$%&’*+/=?`{|}~^-]+(?:\\\\.[\\\\w!#$%&’*+/=?`{|}~^-]+)*@(?:[a-zA-Z0-9-]+\\\\.)+[a-zA-Z]{2,6}$";
        Pattern pattern = Pattern.compile(EMAIL_REGIX);
        Matcher matcher = pattern.matcher(enteredEmail);
        return ((!enteredEmail.isEmpty()) && (enteredEmail!=null) && (matcher.matches()));
    }

সূত্র: - http://howtodoinjava.com/2014/11/11/java-regex-)ate-email-address/

http://www.rfc-editor.org/rfc/rfc5322.txt


-2

অন্য বিকল্প হ'ল হাইবারনেট ইমেল বৈধকারক ব্যবহার করুন, টীকাগুলি @Emailব্যবহার করে বা বৈকল্পিক শ্রেণিটি প্রোগ্রামক্রমে ব্যবহার করুন, যেমন:

import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator; 

class Validator {
    // code
    private boolean isValidEmail(String email) {
        EmailValidator emailValidator = new EmailValidator();
        return emailValidator.isValid(email, null);
    }

}

ডাউনটা কেন? এটি হাইবারনেট ভ্যালিডেটর দ্বারা ব্যবহৃত একই শ্রেণি।
ধেরিক

-3

এগুলি আমার ব্যবহারিক পদ্ধতির, যেখানে আমি আরএফসি থেকে অনুমতিযোগ্য অক্ষরগুলি ব্যবহার করে যুক্তিসঙ্গত স্বতন্ত্র ব্লা @ ডোমেন ঠিকানাগুলি চাই। ঠিকানাগুলি আগেই লোয়ারকেসে রূপান্তর করতে হবে।

public class EmailAddressValidator {

    private static final String domainChars = "a-z0-9\\-";
    private static final String atomChars = "a-z0-9\\Q!#$%&'*+-/=?^_`{|}~\\E";
    private static final String emailRegex = "^" + dot(atomChars) + "@" + dot(domainChars) + "$";
    private static final Pattern emailPattern = Pattern.compile(emailRegex);

    private static String dot(String chars) {
        return "[" + chars + "]+(?:\\.[" + chars + "]+)*";
    }

    public static boolean isValidEmailAddress(String address) {
        return address != null && emailPattern.matcher(address).matches();
    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.