Ich muss E-Mails und Domains validieren. Ich brauche nur eine formale Validierung, keine Whois oder andere Formen der Domain-Suche benötigt.
Momentan benutze ich Apache commons-validator v1.4.0
Leider verwenden meine Kunden die neuen gTLDs, wie .bike oder .productions, die noch nicht von der DomainValidator-Klasse unterstützt werden. Weitere Informationen finden Sie Apache Jira-Problem .
Gibt es irgendwelche vernünftigen Alternativen, die ich leicht in mein Maven POM aufnehmen kann?
Wenn Sie nicht an internationalisierten Adressen interessiert sind, könnten Sie den letzten Teil der Adresse ändern und weiterhin Apache commons verwenden.
Dieser Ansatz basiert auf der Tatsache, dass unabhängig von der TLD die Gültigkeit des gesamten Domänennamens der Gültigkeit desselben Domänennamens entspricht, wobei die TLD durch com
ersetzt wird. Zum Beispiel:
abc.def.com
ist gültig. Entsprechend sind abc.def.name
, abc.def.xx--kput3i
, abc.def.uk
gültig. ab,de.com
ist nicht gültig. Ebenso sind ab,de.name
, ab,de.xx-kput3i
, ab,de.uk
nicht gültig. Also anstatt
aufzurufen %Vor%Sie können
anrufen %Vor%Erläuterung
"\.\p{Alpha}[\p{Alnum}-]*\p{Alnum}$"
sucht nach dem TLD-Teil: Er steht am Ende des Strings (wegen $
), er beginnt mit einem Punkt und enthält keinen anderen Punkt und entspricht den Standards: beginnt mit einem ASCII-Alpha-Zeichen, gefolgt von null oder mehr alphanumerischen Zeichen oder Bindestrichen, und endet mit einem alphanumerischen Zeichen. trim()
, weil bis jetzt, wenn Sie EmailValidator
verwendet haben, Leerzeichen vor und hinter der Adresse erlaubt sind. Das Entfernen der Leerzeichen macht es einfach, die TLD zu ersetzen, und es sollte keine Rolle spielen, was die Gültigkeit der Adresse betrifft. String.replaceFirst()
sie unverändert zurück. Es könnte immer noch gültig sein, weil E-Mail-Adressen des Formats x@[n.n.n.n]
, wobei n.n.n.n.
eine gültige IP-Adresse ist, gültig sind. Wenn Sie also keine TLD gefunden haben, lassen Sie EmailValidator
das Gültigkeitsproblem selbst entscheiden. [email protected]
wird als legal akzeptiert, aber IANA hat diese TLD noch nicht. Das Überprüfen einer Domain ist ähnlich, ohne den trim()
-Teil:
Ich habe auch versucht, die E-Mail-Adresse von JavaMail zu validieren, aber ich mag es nicht wirklich: es erlaubt völlig ungültige Domainnamen wie net-name.net-
(mit einem Bindestrich enden) oder IP-Adressen (die für E-Mail nicht erlaubt sind ohne eckige Klammern um sie herum), und es ist nur gut für E-Mail-Adressen, nicht für Domänen.
Wenn Sie nach internationalisierten Domains und E-Mails suchen müssen, ist das ein bisschen anders. Es ist einfach, nach internationalisierten Domains zu suchen (zum Beispiel 元気。テスト
). Alles, was Sie tun müssen, ist, sie in ASCII mit java.net.IDN.toASCII()
zu konvertieren (mit xn--z4qx76d.xn--zckzah
für meine Beispieldomäne - das ist eine gültige TLD), und dann machen Sie das gleiche wie oben beschrieben.
Internationalisierte E-Mails sind eine andere Geschichte. Wenn der lokale Teil ASCII ist, können Sie den Teil der Domäne in ASCII konvertieren. Wenn Sie die E-Mail-Adresse anzeigen müssen, müssen Sie die Unicode-Version verwenden, und wenn Sie eine E-Mail-Nachricht senden müssen, verwenden Sie die ASCII-Version.
Aber in letzter Zeit wurde auch ein Standard für internationalisierte lokale Teile eingeführt, der es ermöglicht, auch an die Unicode-Version des Domainnamens zu senden, ohne sie zuerst in ASCII zu übersetzen. Ob Sie dies unterstützen wollen oder nicht, erfordert einige Überlegungen, da derzeit nicht viele Mail-Server und Mail-Transfer-Agenten dies unterstützen.
Die Implementierung wurde von DomainValidator kopiert und ersetzte den Ausdruck TOP_LABEL_REGEX
durch "\p{Alpha}[\p{Alnum}-]*\p{Alpha}"
.
Außerdem habe ich die Validierung gegen die fest codierte Liste der genehmigten gTLDs entfernt. Dies ist im Grunde recht schwach, da es nicht gegen die tatsächlichen Domänen validiert. Aber ich denke, es ist gut genug (fängt die gTLDs ähnlich wie XN--YGBI2AMMX
).
Siehe die vollständige Liste der genehmigten gTLDs hier .
%Vor%Was ich in dieser Situation oft tue, ist, den Quellcode für die fragliche Bibliothek auszuchecken (es ist Open Source, erinnern Sie sich?), modifizieren Sie es an meine Anforderung und tragen Sie dann den Patch zurück zum Projekt.
Ihr Anwendungsfall klingt sicherlich so, als wäre es ein nützlicher Beitrag.
Ich habe Sie zu einer öffentlichen Suffix-Liste Java API gemacht. Die Methode PublicSuffixList.getRegistrableDomain()
kann für die Domain-Validierung verwendet werden:
Tags und Links java apache validation