जावा के लिए अच्छा ईमेल पता सत्यापन पुस्तकालय क्या हैं? क्या वैधीकरण के लिए कोई विकल्प हैं ?
जावा के लिए अच्छा ईमेल पता सत्यापन पुस्तकालय क्या हैं? क्या वैधीकरण के लिए कोई विकल्प हैं ?
जवाबों:
Apache Commons को आमतौर पर एक ठोस परियोजना के रूप में जाना जाता है। ध्यान रखें, हालांकि, आपको अभी भी पते पर एक सत्यापन ईमेल भेजना होगा यदि आप यह सुनिश्चित करना चाहते हैं कि यह एक वास्तविक ईमेल है, और यह कि स्वामी आपकी साइट पर इसका उपयोग करना चाहता है।
EDIT : एक बग था जहां यह डोमेन पर बहुत अधिक प्रतिबंधात्मक था, जिससे यह नए TLD के मान्य ईमेल को स्वीकार नहीं करता था।
इस बग को कॉमन्स-वैलिडेटर संस्करण 1.4.1 में 03 / जनवरी / 15 02:48 को हल किया गया था
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
। इसके अलावा, श्वेत स्थान को जोड़ने या पीछे खींचने से तार भी अमान्य नहीं होते हैं। आप ही फैन्सला करें!
Apache Commons सत्यापनकर्ता का उपयोग अन्य उत्तरों में उल्लिखित के रूप में किया जा सकता है।
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();
}
परीक्षण के मामले :
उत्पादन उद्देश्य के लिए, डोमेन नाम सत्यापन नेटवर्क-वार किया जाना चाहिए।
यदि आप क्लाइंट से प्राप्त एक फॉर्म सत्यापन करने की कोशिश कर रहे हैं, या सिर्फ एक सेम सत्यापन - इसे सरल रखें। एक सख्त ईमेल करने के बजाय एक सख्त ईमेल सत्यापन करना और कुछ लोगों को अस्वीकार करना बेहतर है, (जैसे जब वे आपकी वेब सेवा के लिए पंजीकरण करने की कोशिश कर रहे हैं)। ईमेल के उपयोगकर्ता नाम भाग में लगभग कुछ भी और इतने सारे नए डोमेन को हर महीने शाब्दिक रूप से जोड़े जाने की अनुमति है (जैसे .company, .reprise, .estate), यह प्रतिबंधित नहीं होने के लिए सुरक्षित है:
Pattern pattern = Pattern.compile("^.+@.+\\..+$");
Matcher matcher = pattern.matcher(email);
इस प्रश्न के उत्तर में, यहां, लेकिन: मैं इस पते पर एक क्लास बनाए रखता हूं: http://lacinato.com/cm/software/emailrelated/emailaddress
यह लेस हेज़लवुड की कक्षा पर आधारित है, लेकिन इसमें कई सुधार हैं और कुछ बग्स को ठीक करता है। अपाचे लाइसेंस।
मेरा मानना है कि यह जावा में सबसे अधिक सक्षम ईमेल पार्सर है, और मुझे अभी तक किसी भी भाषा में एक और सक्षम देखना है, हालांकि वहां कोई भी हो सकता है। यह एक लेसर-स्टाइल पार्सर नहीं है, लेकिन कुछ जटिल जावा रेगेक्स का उपयोग करता है, और इस प्रकार यह उतना कुशल नहीं है जितना कि हो सकता है, लेकिन मेरी कंपनी ने इसके साथ 10 बिलियन से अधिक वास्तविक दुनिया के पते प्राप्त किए हैं: यह निश्चित रूप से उच्च-प्रदर्शन में उपयोग करने योग्य है परिस्थिति। हो सकता है कि साल में एक बार यह एक ऐसा पता लगाएगा जो रेक्सक्स स्टैक ओवरफ़्लो (उचित रूप से) का कारण बनता है, लेकिन ये स्पैम पते हैं जो सैकड़ों या हजारों वर्णों के साथ कई उद्धरणों और कोष्ठकों और इसी तरह लंबे होते हैं।
RFC 2822 और संबंधित स्पेक्स ईमेल पतों के मामले में वास्तव में काफी स्वीकार्य हैं, इसलिए इस तरह का एक वर्ग अधिकांश उपयोगों के लिए ओवरकिल है। उदाहरण के लिए, कल्पना, रिक्त स्थान और सभी के अनुसार, एक वैध पता है:
"<bob \" (here) " < (hi there) "bob(the man)smith" (hi) @ (there) example.com (hello) > (again)
कोई मेल सर्वर इसकी अनुमति नहीं देगा, लेकिन यह वर्ग इसे पार्स कर सकता है (और इसे एक उपयोगी रूप में फिर से लिख सकता है)।
हमने मौजूदा जावा ईमेल पार्सर विकल्पों को अपर्याप्त रूप से टिकाऊ होने के लिए पाया (मतलब, उनमें से सभी कुछ मान्य पते पार्स नहीं कर सकते थे), इसलिए हमने यह वर्ग बनाया।
कोड अच्छी तरह से प्रलेखित है और इसमें कुछ ईमेल रूपों को अनुमति देने या अस्वीकार करने के लिए बहुत आसान-से-बदलाव विकल्प हैं। यह पते के कुछ हिस्सों (बाएँ हाथ की ओर, दाएँ हाथ की ओर, व्यक्तिगत नाम, टिप्पणियाँ, आदि) को एक्सेस करने, मेलबॉक्स-लिस्ट हेडर को पार्स / मान्य करने, रिटर्न-पथ को पार्स / वैलिडेट करने के लिए बहुत सारे तरीके प्रदान करता है। (जो हेडर के बीच अद्वितीय है), और इसके आगे।
कोड के रूप में लिखा एक javamail निर्भरता है, लेकिन अगर आप इसे प्रदान करता है मामूली कार्यक्षमता नहीं चाहते हैं तो इसे दूर करना आसान है।
मैं सोच रहा हूं कि @Email
हाइबरनेट वैलिडेटर के अतिरिक्त अवरोधों के कारण कोई भी क्यों नहीं आया । सत्यापनकर्ता ही है EmailValidator
।
लेस हेज़लवुड ने जावा नियमित अभिव्यक्तियों का उपयोग करते हुए एक बहुत ही गहन RFC 2822 आज्ञाकारी ईमेल सत्यापनकर्ता वर्ग लिखा है। आप इसे http://www.leshazlewood.com/?p=23 पर पा सकते हैं । हालांकि, इसकी पूरी तरह से (या जावा आरई कार्यान्वयन) अक्षमता की ओर जाता है - लंबे पते के लिए पार्सिंग समय के बारे में टिप्पणियों को पढ़ें।
मैंने Zend_Validator_Email में कुछ कोड डाले:
@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()]);
}
}
और अलग tisions के लिए regex पैटर्न के साथ एक validIDNs.xml (शामिल करने के लिए बहुत बड़ा :)
<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));
}
}
यदि आप यह सत्यापित करना चाहते हैं कि ईमेल पता मान्य है या नहीं, तो VRFY आपको कुछ रास्ता देगा। मैंने पाया है कि यह इंट्रानेट पतों (यानी आंतरिक साइटों के लिए ईमेल पतों) को मान्य करने के लिए उपयोगी है । हालाँकि यह इंटरनेट मेल सर्वरों के लिए कम उपयोगी है (इस पृष्ठ के शीर्ष पर स्थित कैवेट देखें)
हालांकि अपाचे कॉमन्स के लिए कई विकल्प हैं, लेकिन उनके कार्यान्वयन सबसे अच्छे रूप में अल्पविकसित हैं (जैसे अपाचे कॉमन्स के कार्यान्वयन स्वयं) और अन्य मामलों में भी गलत हैं।
मैं भी तथाकथित 'गैर-प्रतिबंधक' रेगेक्स से दूर रहूँगा; ऐसा कुछ भी नहीं है। उदाहरण के लिए @ संदर्भ के आधार पर कई बार अनुमति दी जाती है, आप कैसे जानते हैं कि आवश्यक एक है? साधारण रेगेक्स इसे नहीं समझेगा, भले ही ईमेल वैध होना चाहिए। कुछ भी अधिक जटिल त्रुटि-प्रवण हो जाता है या यहां तक कि छिपे हुए प्रदर्शन हत्यारे भी होते हैं । आप इस तरह से कुछ कैसे बनाए रखने जा रहे हैं ?
एकमात्र व्यापक RFC आज्ञाकारी regex आधारित सत्यापनकर्ता जिसके बारे में मुझे पता है, वह है ईमेल-rfc2822-validator जिसका 'परिष्कृत' regex उचित रूप से ड्रेगन.जवा नाम से है । हालांकि, यह केवल पुराने RFC-2822 युक्ति का समर्थन करता है , हालाँकि आधुनिक आवश्यकताओं के लिए पर्याप्त उपयुक्त है (RFC-5322 इसे दैनिक उपयोग के मामलों के लिए पहले से ही दायरे से बाहर के क्षेत्रों में अपडेट करता है)।
लेकिन वास्तव में आप जो चाहते हैं वह एक ऐसा लेसर है जो एक स्ट्रिंग को ठीक से पार्स करता है और इसे RFC डमर के अनुसार घटक संरचना में तोड़ देता है। EmailValidator4J उस संबंध में आशाजनक लगता है, लेकिन अभी भी युवा और सीमित है।
एक अन्य विकल्प जो आपके पास है वेब्सगैस का उपयोग कर रहा है जैसे कि मेलगुन की लड़ाई-परीक्षण वाली सत्यापन वेब सेवा या मेलबॉक्लेयर एपीआई (बस पहले Google परिणाम लिया)। यह सख्ती से आरएफसी का अनुपालन नहीं है, लेकिन आधुनिक जरूरतों के लिए पर्याप्त रूप से काम करता है।
आप क्या सत्यापित करना चाहते हैं? ईमेल का पता?
ईमेल पता केवल उसके प्रारूप अनुरूपता के लिए जाँच की जा सकती है। : मानक देखें RFC2822 । ऐसा करने का सबसे अच्छा तरीका एक नियमित अभिव्यक्ति है। आप कभी नहीं जान पाएंगे कि क्या वास्तव में कोई ईमेल भेजे बिना मौजूद है।
मैंने कॉमन्स सत्यापनकर्ता की जाँच की। इसमें एक org.apache.commons.validator.EmailValidator वर्ग शामिल है। एक अच्छा प्रारंभिक बिंदु लगता है।
वर्तमान अपाचे कॉमन्स वैलिडेटर संस्करण 1.3.1 है ।
जो वर्ग मान्य करता है वह है org.apache.commons.validator.EmailValidator। यह org.apache.oro.text.perl.Perl5Util के लिए एक आयात है जो एक सेवानिवृत्त जकार्ता ORO परियोजना से है ।
BTW, मैंने पाया कि एक 1.4 संस्करण है, यहाँ एपीआई डॉक्स हैं । पर साइट यह कहते हैं: "अंतिम प्रकाशन: 05 मार्च 2008 | संस्करण: 1.4-स्नैपशॉट", लेकिन वह अंतिम नहीं है। केवल अपने आप को बनाने का तरीका (लेकिन यह स्नैपशॉट है, RELEASE नहीं) और यहाँ से उपयोग करें, या डाउनलोड करें । इसका मतलब है कि 1.4 को तीन साल (2008-2011) के लिए अंतिम नहीं बनाया गया है। यह अपाचे की शैली में नहीं है। मैं एक बेहतर विकल्प की तलाश कर रहा हूं, लेकिन ऐसा नहीं मिला जो बहुत अपनाया गया हो। मैं कुछ ऐसी चीजों का उपयोग करना चाहता हूं जो अच्छी तरह से जांची हुई हों, किसी भी कीड़े को मारना नहीं चाहते हैं।
आप लंबाई की जांच भी कर सकते हैं - ईमेल अधिकतम 254 वर्ण लंबे होते हैं। मैं अपाचे कॉमन्स वेरिलेटर का उपयोग करता हूं और यह इसके लिए जांच नहीं करता है।
ऐसा करने के लिए कोई भी सही लाइब्रेरी या तरीके नहीं हैं, जब तक कि आपको ईमेल पते पर ईमेल भेजने और प्रतिक्रिया की प्रतीक्षा करने का समय नहीं है (हालांकि यह एक विकल्प नहीं हो सकता है)। मैंने यहाँ से एक सुझाव http://blog.logichigh.com/2010/09/02/validating-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-validate-email-adress/
एक अन्य विकल्प हाइबरनेट ईमेल सत्यापनकर्ता का उपयोग करता है, एनोटेशन @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);
}
}
मेरे व्यावहारिक दृष्टिकोण का उपयोग करता है, जहां मैं RFC से स्वीकार्य वर्णों का उपयोग करके उचित विशिष्ट blah @ डोमेन पते चाहता हूं। पते पहले से निचले हिस्से में परिवर्तित होने चाहिए।
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();
}
}