Öncelikle, sen demek olmadığını açıklamak gerekir:
- tek etki alanı adı etiketler
- tüm alan adları (yani birden fazla nokta-ayrı etiketler)
- ana bilgisayar adları
Ayrım gerekli nedeni etiketi teknik NUL, @
ve '.
' karakterleri de dahil olmak üzere any karakterleri içerebilir olmasıdır. DNS 8-bit yetenekli ve bir giriş okuma "an\0odd\.l@bel
". It's not recommended of course, not least because people would have difficulty telling a dot inside a label from those separating labels, but it is yasal içeren bir bölge dosyası için mükemmel mümkündür.
Ancak, URLs onları bir host adını gerektirir, ve bu RFC 952 ve 1123 tarafından yönetilir. Valid host isimleri {[(3) bir alt kümesidir ]} isimler. Özellikle sadece harfler, rakamlar ve tire izin verilir. Ayrıca ilk ve son karakterler tire olamaz. RFC 952 ilk karakter için bir dizi izin vermedi, ancak RFC 1123 sonradan o rahat.
Bu nedenle:
a
strong> - geçerlidir
0
strong> - geçerlidir
a-
strong> - geçersiz
a-b
strong> - geçerlidir
xn--dasdkhfsd
strong> - geçerli (bir IDN arasında punycode kodlama)
Kafamın üst kapalı Ben tek bir basit regexp ile a-
örneği geçersiz mümkün olduğunu sanmıyorum. Ben bir kontrol ile gelebilir iyi single _host_ etiket:
if (preg_match('/^[a-z\d][a-z\d-]{0,62}$/i', $label) &&
!preg_match('/-$/', $label))
{
# label is legal within a hostname
}
Daha da karmaşıklaştıran, bazı alan adı kayıtları (tipik SRV
kayıtları) bir çizgi ile öneki etiketleri, örneğin kullanın _sip._udp.example.com
. Bu not konak isimler, ancak yasal alan adları vardır.