Tôi biết rằng đây là một bài viết hơi cũ, nhưng tất cả các cụm từ thông dụng ở đây đều thiếu một thành phần rất quan trọng: hỗ trợ cho tên miền IDN.
Tên miền IDN bắt đầu bằng xn--. Chúng cho phép các ký tự UTF-8 mở rộng trong tên miền. Ví dụ: bạn có biết "♡ .com" là một tên miền hợp lệ không? Yeah, "love heart dot com"! Để xác thực tên miền, bạn cần để http://xn--c6h.com/ vượt qua quá trình xác thực.
Lưu ý, để sử dụng regex này, bạn sẽ cần phải chuyển đổi tên miền thành chữ thường và cũng sử dụng thư viện IDN để đảm bảo bạn mã hóa tên miền thành ACE (còn được gọi là "Mã hóa tương thích ASCII"). Một thư viện tốt là GNU-Libidn.
idn (1) là giao diện dòng lệnh đến thư viện tên miền quốc tế. Ví dụ sau chuyển đổi tên máy chủ trong UTF-8 thành mã hóa ACE. Sau đó, URL kết quả https: //nic.xn--flw351e/ sau đó có thể được sử dụng làm tương đương được mã hóa ACE của https: // nic. 谷 歌 / .
$ idn --quiet -a nic.谷歌
nic.xn--flw351e
Biểu thức chính quy ma thuật này sẽ bao gồm hầu hết các miền (mặc dù, tôi chắc chắn rằng có nhiều trường hợp cạnh hợp lệ mà tôi đã bỏ qua):
^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$
Khi chọn regex xác thực tên miền, bạn nên xem tên miền có khớp với những điều sau đây không:
- xn--stackoverflow.com
- stackoverflow.xn - com
- stackoverflow.co.uk
Nếu ba miền này không vượt qua, biểu thức chính quy của bạn có thể không cho phép các miền hợp pháp!
Hãy xem trang Hỗ trợ Tên miền Quốc tế hóa từ Hướng dẫn Môi trường Ngôn ngữ Quốc tế của Oracle để biết thêm thông tin.
Vui lòng dùng thử regex tại đây: http://www.regexr.com/3abjr
ICANN lưu giữ danh sách các tld đã được ủy quyền có thể được sử dụng để xem một số ví dụ về miền IDN.
Biên tập:
^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$
Cụm từ thông dụng này sẽ ngăn các miền có dấu '-' ở cuối tên máy chủ được đánh dấu là hợp lệ. Ngoài ra, nó cho phép các miền phụ không giới hạn.