2011-02-09 22 views
8

Tôi muốn sử dụng phần tử <input type="email" /> mới. Tôi muốn có mã Java thực hiện xác nhận giống nhau trên máy chủ xảy ra trong trình duyệt.Có thực hiện Java xác thực email đầu vào HTML5 không?

The HTML5 spec defines email addresses trong ABNF như:

1*(atext/".") "@" ldh-str *("." ldh-str) 

where:

<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str> 

<let-dig-hyp> ::= <let-dig> | "-" 

<let-dig> ::= <letter> | <digit> 

<letter> ::= any one of the 52 alphabetic characters A through Z in upper case and a through z in lower case 

<digit> ::= any one of the ten digits 0 through 9 

and:

atext   = ALPHA/DIGIT/ ; Printable US-ASCII 
         "!"/"#"/  ; characters not including 
         "$"/"%"/  ; specials. Used for atoms. 
         "&"/"'"/
         "*"/"+"/
         "-"/"/"/
         "="/"?"/
         "^"/"_"/
         "`"/"{"/
         "|"/"}"/
         "~" 

Đây là những không các quy tắc tương tự như trong RFC 5322. Làm cách nào để kiểm tra xem địa chỉ có tuân thủ các quy tắc này trong Java không?

Cảm ơn!

+0

Tôi không biết liệu giải pháp readymade có tồn tại hay không nhưng nếu bạn không thể tìm thấy bất kỳ giải pháp nào, bạn có thể dễ dàng tạo một giải pháp với PEP. http://www.ling.ohio-state.edu/~scott/ – biziclop

Trả lời

6

Bạn có thể sử dụng một regex:

[A-Za-z0-9!#$%&'*+-/=?^_`{|}~][email protected][A-Za-z0-9-]+(.[A-Za-z0-9-]+)*

+0

'user @ domain' xác thực với điều đó. Bạn không cần một dấu chấm sau '@'? – Adam

+0

@Adam: Đây là ý nghĩa của định nghĩa của bạn. Để trả lời câu hỏi của bạn, về mặt kỹ thuật, không. – SLaks

+0

Tệ của tôi.'*' trong ABNF bao gồm 0. – Adam

1

Trên thực tế, The W3C Recommendation you've cited cung cấp một regex như tương đương với những gì họ thể hiện như ABNF trong đó xác định một địa chỉ email hợp lệ:

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/ 

Nhưng regex này phù hợp với không hợp lệ địa chỉ email, chẳng hạn như ".any..address. @ 123" (được thử nghiệm với https://regex101.com/).

regex này chấp nhận (tất cả không hợp lệ trong địa chỉ email, theo Wikipedia):

  • "" (dấu chấm) ở đầu phần địa phương
  • "." (chấm) ở cuối phần địa phương
  • nhiều tuần tự "." (Dấu chấm) trong phần địa phương
  • chỉ số trong phần miền

và từ chối (có giá trị theo Wikipedia):

  • ký tự Unicode
  • một số ký tự đặc biệt được phân định với dấu ngoặc kép (")

Lưu ý rằng W3C nói rằng đặc điểm kỹ thuật mà họ trình bày là willful violation của RFC 5322, vì vậy họ có "lý do" để loại bỏ các trường hợp hợp lệ, nhưng IMHO không phải là lý do để chấp nhận địa chỉ không hợp lệ.

Nếu bạn không bận tâm với những trường hợp ngoại lệ đó, bạn có thể sử dụng regex mà W3C đề xuất. Nếu không, bạn nên làm việc regex để bao gồm các trường hợp bạn muốn xử lý.

+0

Nó không từ chối tất cả các ký tự không phải ASCII vì nó được cho là được thực hiện trên phiên bản punycode, vì vậy 'example @ яндекс.рф' sẽ được chuyển thành' example @ xn - d1acpjx3f.xn - p1ai' . Nó mặc dù từ chối các địa chỉ email hợp lệ với các ký tự không phải ASCII trước '@'. –

Các vấn đề liên quan