জাভা জন্য ভাল ইমেল ঠিকানা বৈধতা লাইব্রেরি কি? কমন্স ভ্যালিডেটরের কোনও বিকল্প আছে কি?
জাভা জন্য ভাল ইমেল ঠিকানা বৈধতা লাইব্রেরি কি? কমন্স ভ্যালিডেটরের কোনও বিকল্প আছে কি?
উত্তর:
অ্যাপাচি কমন্স সাধারণত একটি শক্ত প্রকল্প হিসাবে পরিচিত। মনে রাখবেন, তবে, আপনি যদি এখনও এটি সত্যিকারের ইমেল নিশ্চিত করতে চান এবং মালিক এটি আপনার সাইটে এটি ব্যবহার করতে চায় তবে আপনাকে ঠিকানায় একটি যাচাইকরণ ইমেল প্রেরণ করতে হবে।
সম্পাদনা : একটি ত্রুটি ছিল যেখানে এটি ডোমেনের উপরে খুব বাধা ছিল, যার ফলে এটি নতুন টিএলডি থেকে বৈধ ইমেলগুলি গ্রহণ করবে না।
এই বাগটি 03 / জানুয়ারী / 15 02:48 এ কমন্স-ভ্যালিডেটর সংস্করণ 1.4.1 এ সমাধান করা হয়েছে
EmailValidator
ক্লাস যাচাইয়ের জন্য কোনও ইমেল বার্তা প্রেরণ করে না।
অফিসিয়াল জাভা ইমেল প্যাকেজ ব্যবহার করা সবচেয়ে সহজ:
public static boolean isValidEmailAddress(String email) {
boolean result = true;
try {
InternetAddress emailAddr = new InternetAddress(email);
emailAddr.validate();
} catch (AddressException ex) {
result = false;
}
return result;
}
.
, .com
, com.
, abc
এবং 123
। এছাড়াও, শীর্ষস্থানীয় বা পিছনে সাদা স্থান যুক্ত করা স্ট্রিংগুলিকে অকার্যকর করে না। তুমি বিচারক হউ!
অন্যান্য জবাব হিসাবে উল্লিখিত হিসাবে অ্যাপাচি কমন্স ভ্যালিডেটর ব্যবহার করা যেতে পারে।
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);
দেরীতে উত্তর, তবে আমি মনে করি এটি সহজ এবং যোগ্য:
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();
}
পরীক্ষার কেস :
উত্পাদনের উদ্দেশ্যে, ডোমেন নেম বৈধতা নেটওয়ার্ক ভিত্তিক করা উচিত।
আপনি যদি ক্লায়েন্টের কাছ থেকে প্রাপ্ত কোনও ফর্ম বৈধতা বা কেবল একটি শিমের বৈধতা দেওয়ার চেষ্টা করছেন - এটিকে সহজ রাখুন। কোনও কঠোর ব্যবহার না করে কিছু লোককে প্রত্যাখ্যান করার চেয়ে আলগা ইমেল বৈধকরণ করা ভাল (উদাহরণস্বরূপ যখন তারা আপনার ওয়েব পরিষেবার জন্য নিবন্ধ করার চেষ্টা করছেন)। ইমেলের ব্যবহারকারীর নাম অংশে অনুমোদিত যে কোনও কিছু এবং প্রতি মাসে আক্ষরিক অর্থে প্রচুর নতুন ডোমেন যুক্ত হওয়া (উদাহরণস্বরূপ। কমপানি, .entreprise, .estate), এটি সীমাবদ্ধ না রাখাই নিরাপদ:
Pattern pattern = Pattern.compile("^.+@.+\\..+$");
Matcher matcher = pattern.matcher(email);
এই প্রশ্নের শেষ পর্যন্ত, তবে: আমি এই ঠিকানায় একটি শ্রেণি বজায় রেখেছি: http://lacinato.com/cm/software/emailrelated/emailaddress
এটি লেস হ্যাজলউডের ক্লাসের উপর ভিত্তি করে তৈরি হয়েছে তবে এতে কয়েকটি উন্নতি এবং কয়েকটি বাগ সংশোধন করা হয়েছে। অ্যাপাচি লাইসেন্স।
আমি বিশ্বাস করি এটি জাভাতে সর্বাধিক সক্ষম ইমেল পার্সার এবং আমি এখনও কোনও ভাষায় আরও একটি সক্ষম দেখতে পেলাম, যদিও সেখানে একটি থাকতে পারে। এটি কোনও লেক্সার-স্টাইলের পার্সার নয়, তবে কিছু জটিল জাভা রেজেক্স ব্যবহার করে, এবং এটি এতটা দক্ষ হিসাবে কার্যকর নয় তবে আমার সংস্থা এটির সাথে 10 বিলিয়ন রিয়েল-ওয়ার্ল্ড ঠিকানা ভালভাবে পার্স করেছে: এটি অবশ্যই উচ্চ-পারফরম্যান্সে ব্যবহারযোগ্য অবস্থা. সম্ভবত বছরে একবার এটি এমন কোনও ঠিকানাকে আঘাত করবে যা একটি রেগেক্স স্ট্যাকের ওভারফ্লোর কারণ হয়ে দাঁড়ায় (যথাযথভাবে), তবে এগুলি স্প্যাম ঠিকানা যা অনেকগুলি উদ্ধৃতি এবং প্রথম বন্ধনী এবং এর মতো কয়েকশ বা হাজার হাজার অক্ষরের দীর্ঘ।
আরএফসি 2822 এবং সম্পর্কিত চশমাগুলি ইমেল ঠিকানাগুলির ক্ষেত্রে সত্যিই বেশ অনুমতিযোগ্য, সুতরাং এর মতো একটি শ্রেণি বেশিরভাগ ব্যবহারের জন্য ওভারকিল। উদাহরণস্বরূপ, স্পেস, স্পেস এবং সমস্ত অনুসারে নিম্নলিখিতটি একটি বৈধ ঠিকানা address
"<bob \" (here) " < (hi there) "bob(the man)smith" (hi) @ (there) example.com (hello) > (again)
কোনও মেল সার্ভার এটির অনুমতি দেয় না, তবে এই শ্রেণিটি এটি বিশ্লেষণ করতে পারে (এবং এটি ব্যবহারযোগ্য ফর্মটিতে আবার লিখতে পারে)।
আমরা বিদ্যমান জাভা ইমেল পার্সার বিকল্পগুলি অপর্যাপ্তভাবে টেকসই হওয়ার জন্য পেয়েছি (যার অর্থ, এগুলির সমস্ত কিছু বৈধ ঠিকানা পার্স করতে পারে না), সুতরাং আমরা এই শ্রেণিটি তৈরি করেছি।
কোডটি ভাল-ডকুমেন্টেড এবং নির্দিষ্ট ইমেল ফর্মগুলিকে মঞ্জুর বা অস্বীকার করার জন্য অনেকগুলি সহজেই পরিবর্তন-করার বিকল্প রয়েছে। এটি ঠিকানার কিছু অংশ (বাম-হাত, ডান-হাতের দিক, ব্যক্তিগত নাম, মন্তব্য ইত্যাদি) অ্যাক্সেস করার, মেথবক্স-তালিকার শিরোনামগুলি বৈধ করতে / ফেরার পথটিকে বৈধ করার জন্য প্রচুর পদ্ধতি সরবরাহ করে (যা শিরোলেখগুলির মধ্যে স্বতন্ত্র) এবং আরও অনেক কিছু।
লিখিত হিসাবে কোডটির একটি জাভামাইল নির্ভরতা রয়েছে তবে আপনি যদি এটি সরবরাহ করেন এমন ছোটখাটো কার্যকারিতা না চান তবে এটি সরানো সহজ।
আমি কেবল ভাবছি কেন @Email
হাইবারনেট ভ্যালিডেটরের অতিরিক্ত বাধাগুলি থেকে কেউ এলো না । যাচাইকারী নিজেই EmailValidator
।
লেস হ্যাজলউড জাভা নিয়মিত অভিব্যক্তি ব্যবহার করে একটি খুব পুঙ্খানুপুঙ্খ আরএফসি 2822 কমপ্লায়েন্ট ইমেল বৈধ লেখক শ্রেণি লিখেছেন। আপনি এটি http://www.leshazlewood.com/?p=23 এ খুঁজে পেতে পারেন । তবে, এর সম্পূর্ণতা (বা জাভা আরই বাস্তবায়ন) অদক্ষতার দিকে পরিচালিত করে - দীর্ঘ ঠিকানাগুলির জন্য পার্সিং বার সম্পর্কে মন্তব্যগুলি পড়ুন।
আমি জেনড_ভালিডেটর_মাইলে কিছু কোড পোর্ট করেছি:
@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>
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));
}
}
আপনি যদি ইমেল ঠিকানাটি বৈধ কিনা তা যাচাই করতে খুঁজছেন, তবে ভিআরএফওয়াই আপনাকে কিছুটা পথ পাবে। আমি খুঁজে পেয়েছি এটি ইন্ট্রানেট ঠিকানাগুলি বৈধকরণের জন্য দরকারী (এটি অভ্যন্তরীণ সাইটের ইমেল ঠিকানা)। তবে এটি ইন্টারনেট মেল সার্ভারগুলির জন্য কম দরকারী (এই পৃষ্ঠার শীর্ষে ক্যাভ্যাটগুলি দেখুন)
যদিও অ্যাপাচি কমনের অনেক বিকল্প রয়েছে, তবে তাদের প্রয়োগগুলি সর্বোত্তমভাবে প্রাথমিক (যেমন অ্যাপাচি কমন্সের প্রয়োগ) হিসাবে) এবং এমনকি অন্য ক্ষেত্রে মৃত ভুলও হতে পারে
আমি তথাকথিত সাধারণ 'অ-নিষেধাজ্ঞামূলক' রেজেক্স থেকেও দূরে থাকতাম; এখানে এমন কোন জিনিস নেই. উদাহরণস্বরূপ @ প্রসঙ্গের উপর নির্ভর করে @ কে একাধিকবার অনুমতি দেওয়া হয়েছে , আপনি কীভাবে জানবেন যে সেখানে প্রয়োজনীয় একটি রয়েছে? ইমেলটি বৈধ হওয়া উচিত যদিও সিম্পল রেজেক্স এটি বুঝতে পারবেন না। আরও জটিল যে কোনও কিছুই ত্রুটি-প্রবণ হয়ে যায় বা লুকানো পারফরম্যান্স হত্যাকারীদের ধারণ করে । আপনি কিভাবে ভালো কিছু বজায় রাখা করতে যাচ্ছি এই ?
আমি সম্পর্কে অবগত একমাত্র বিস্তৃত আরএফসি কমপ্লিয়েন্ট রেজেক্স ভিত্তিক যাচাইকারী হ'ল ইমেল-আরএফসি ২২২২২-ভ্যালিডেটর এর 'রিফাইন্ড' রেগেক্স যথাযথভাবে নামকরণ করা হয়েছে ড্রাগনস.জাভা । এটি কেবলমাত্র পুরানো আরএফসি -2822 নির্দিষ্টকে সমর্থন করে যদিও আধুনিক প্রয়োজনের জন্য যথেষ্ট উপযুক্ত (আরএফসি -৩৩২২ আপডেট) ইতিমধ্যে দৈনিক ব্যবহারের ক্ষেত্রে সুযোগের বাইরে থাকা অঞ্চলে এটি করে)।
তবে সত্যিকার অর্থে আপনি যা চান তা হলেন একটি লেক্সার যা সঠিকভাবে একটি স্ট্রিংকে পার্স করে এবং আরএফসি ব্যাকরণ অনুসারে উপাদান কাঠামোতে এটি ভেঙে দেয়। EmailValidator4J এই বিষয়ে প্রতিশ্রুতিবদ্ধ বলে মনে হয় তবে এটি এখনও তরুণ এবং সীমাবদ্ধ।
আপনার কাছে থাকা আরেকটি বিকল্প হ'ল মেলগুনের যুদ্ধ-পরীক্ষিত বৈধতা ওয়েবসার্চ বা মেলবক্সলেয়ার এপিআই (সবেমাত্র প্রথম গুগলের ফলাফল নিয়েছে) এর মতো একটি ওয়েবসার্ভিস ব্যবহার করছে । এটি কঠোরভাবে আরএফসি অনুগত নয়, তবে আধুনিক প্রয়োজনে যথেষ্ট কাজ করে।
আপনি কী যাচাই করতে চান? ইমেল ঠিকানা?
ইমেল ঠিকানাটি কেবল এটির ফর্ম্যাট কনফর্মেন্সের জন্য পরীক্ষা করা যায়। মানটি দেখুন: আরএফসি 2822 । এটি করার সর্বোত্তম উপায় হ'ল একটি নিয়মিত প্রকাশ। কোনও ইমেল না প্রেরণে আসলেই উপস্থিত কিনা তা আপনি কখনই জানতে পারবেন না।
আমি কমন্স ভ্যালিডেটর চেক করেছি। এটিতে একটি org.apache.commons.ediaator.EmailValidator শ্রেণি রয়েছে। একটি ভাল সূচনা পয়েন্ট বলে মনে হচ্ছে।
বর্তমান অ্যাপাচি কমন্স ভ্যালিডেটর সংস্করণটি 1.3.1 ।
যা শ্রেণি যাচাই করে তা হল org.apache.commons.ediaator.EmailValidator ator এটা তোলে org.apache.oro.text.perl.Perl5Util জন্য একটি ইম্পোর্ট হয়েছে যা অবসরপ্রাপ্ত থেকে জাকার্তা Oro প্রকল্পের ।
বিটিডাব্লু, আমি খুঁজে পেয়েছি যে এখানে একটি 1.4 সংস্করণ রয়েছে, এখানে এপিআই ডক্স রয়েছে । উপর সাইট এটি বলছে: "শেষ প্রকাশের: 05 মার্চ 2008 | সংস্করণ: 1.4-স্ন্যাপশট", কিন্তু যে চূড়ান্ত নয়। নিজেকে তৈরি করার একমাত্র উপায় (তবে এটি স্ন্যাপশট, রিলিজ নয়) এবং ব্যবহার করুন বা এখান থেকে ডাউনলোড করুন । এর অর্থ 1.4 টি তিন বছরের জন্য চূড়ান্ত করা হয়নি (২০০৮-২০১১)। এটি আপাচি স্টাইলে নয়। আমি আরও ভাল বিকল্পের সন্ধান করছি, তবে একটি খুব কার্যকর গৃহীত হয়েছে তা খুঁজে পেলাম না। আমি এমন কিছু ব্যবহার করতে চাই যা ভালভাবে পরীক্ষিত হয়, কোনও বাগ আঘাত করতে চাই না।
আপনি দৈর্ঘ্যের জন্যও দেখতে চাইতে পারেন - ইমেলগুলি সর্বাধিক 254 অক্ষরের দীর্ঘ। আমি অ্যাপাচি কমন্স যাচাইকারী ব্যবহার করি এবং এটি এটি পরীক্ষা করে না।
local-part
64 দৈর্ঘ্য এবং একটি domain
255 দৈর্ঘ্য (। তারা আর অন্যান্য সফটওয়্যার দ্বারা বাতিল করা হতে পারে অনুমোদিত হয় না)
এটি করার মতো কোনও নিখুঁত গ্রন্থাগার বা উপায় রয়েছে বলে মনে হয় না, যদি না আপনাকে ইমেল ঠিকানায় ইমেল প্রেরণ এবং প্রতিক্রিয়াটির জন্য অপেক্ষা করতে হয় (যদিও এটি কোনও বিকল্প হতে পারে না)। আমি এখান থেকে একটি পরামর্শ ব্যবহার করে শেষ করেছিলাম 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();
}
এটি সেরা পদ্ধতি:
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/
অন্য বিকল্প হ'ল হাইবারনেট ইমেল বৈধকারক ব্যবহার করুন, টীকাগুলি @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);
}
}
এগুলি আমার ব্যবহারিক পদ্ধতির, যেখানে আমি আরএফসি থেকে অনুমতিযোগ্য অক্ষরগুলি ব্যবহার করে যুক্তিসঙ্গত স্বতন্ত্র ব্লা @ ডোমেন ঠিকানাগুলি চাই। ঠিকানাগুলি আগেই লোয়ারকেসে রূপান্তর করতে হবে।
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();
}
}