ฉันรู้ว่านี่เป็นบทความเก่า แต่นิพจน์ทั่วไปทั้งหมดที่นี่ขาดองค์ประกอบที่สำคัญอย่างหนึ่งนั่นคือการรองรับชื่อโดเมน IDN
ชื่อโดเมน IDNขึ้นต้นด้วย xn--. เปิดใช้งานอักขระ UTF-8 แบบขยายในชื่อโดเมน ตัวอย่างเช่นคุณทราบหรือไม่ว่า "♡ .com" เป็นชื่อโดเมนที่ถูกต้อง เย้ "ใจรักดอทคอม"! ในการตรวจสอบชื่อโดเมนคุณต้องปล่อยให้http://xn--c6h.com/ผ่านการตรวจสอบความถูกต้อง
หมายเหตุในการใช้ regex นี้คุณจะต้องแปลงโดเมนเป็นตัวพิมพ์เล็กและใช้ไลบรารี IDN เพื่อให้แน่ใจว่าคุณได้เข้ารหัสชื่อโดเมนเป็น ACE (หรือเรียกว่า "ASCII Compatible Encoding") ห้องสมุดที่ดีอย่างหนึ่งคือ GNU-Libidn
idn (1) คืออินเทอร์เฟซบรรทัดคำสั่งไปยังไลบรารีชื่อโดเมนสากล ตัวอย่างต่อไปนี้แปลงชื่อโฮสต์ใน UTF-8 เป็นการเข้ารหัส ACE URL ของhttps: //nic.xn--flw351e/แล้วสามารถใช้เป็น ACE เข้ารหัสเทียบเท่าhttps: //. NIC谷歌 /
$ idn --quiet -a nic.谷歌
nic.xn--flw351e
การแสดงออกปกติของเวทมนตร์นี้ควรครอบคลุมโดเมนส่วนใหญ่ (แม้ว่าฉันแน่ใจว่ามีขอบที่ถูกต้องหลายกรณีที่ฉันพลาดไป):
^((?!-))(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,})$
เมื่อเลือก regex การตรวจสอบโดเมนคุณควรดูว่าโดเมนตรงกับสิ่งต่อไปนี้หรือไม่:
- xn--stackoverflow.com
- stackoverflow.xn - คอม
- stackoverflow.co.uk
หากโดเมนทั้งสามนี้ไม่ผ่านการแสดงออกปกติของคุณอาจไม่อนุญาตให้ใช้โดเมนที่ถูกต้อง!
ดูหน้าการสนับสนุนชื่อโดเมนสากลจากคู่มือสภาพแวดล้อมภาษาสากลของ Oracleสำหรับข้อมูลเพิ่มเติม
อย่าลังเลที่จะลอง regex ที่นี่: http://www.regexr.com/3abjr
ICANNเก็บรายการ tlds ที่ได้รับมอบหมายซึ่งสามารถใช้เพื่อดูตัวอย่างโดเมน IDN
แก้ไข:
^(((?!-))(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,})$
นิพจน์ทั่วไปนี้จะหยุดโดเมนที่มี '-' ต่อท้ายชื่อโฮสต์ว่าถูกทำเครื่องหมายว่าถูกต้อง นอกจากนี้ยังอนุญาตให้มีโดเมนย่อยได้ไม่ จำกัด