apache commons-validator Alternative für neue gTLDS

8

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?

    
Iacopo 25.11.2014, 16:54
quelle

4 Antworten

6

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

  • Der reguläre Ausdruck "\.\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.
  • Ich verwende 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.
  • Wenn die Zeichenfolge am Ende keine gültige TLD hat, gibt 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.
  • Natürlich, wenn die TLD keine von IANA anerkannte TLD ist, wird Ihnen diese Validierung das nicht sagen. Eine E-Mail wie [email protected] wird als legal akzeptiert, aber IANA hat diese TLD noch nicht.

Das Überprüfen einer Domain ist ähnlich, ohne den trim() -Teil:

%Vor%

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.

Internationalisierung

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.

    
RealSkeptic 03.12.2014, 20:33
quelle
1

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%     
AlikElzin-kilaka 12.11.2015 16:18
quelle
0

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.

    
Steve C 05.12.2014 00:07
quelle
0

Ich habe Sie zu einer öffentlichen Suffix-Liste Java API gemacht. Die Methode PublicSuffixList.getRegistrableDomain() kann für die Domain-Validierung verwendet werden:

%Vor%     
Markus Malkusch 05.12.2014 00:11
quelle

Tags und Links