PHP etki alanı adı doğrulamak nasıl?

12 Cevap php

Düzenli ifade kullanarak olmadan mümkün mü?

Örneğin, ben bir dize geçerli bir etki alanı olup olmadığını kontrol etmek istiyorum:

domain-name
abcd
example

Geçerli etki vardır. Bunlar tabii ki geçersizdir:

domaia@name
ab$%cd

Ve böylece. Yani temelde daha sonra alnum karakter artı da bir tire olabilir, bir alfanümerik karakteri ile başlamalıdır. Ve çok, bir alnum karakteri ile bitmelidir.

Bu mümkün değilse, bana bunu yapmak için bir sıradanifade model önerebilirsiniz?

EDIT:

Bu neden çalışmıyor? Ben yanlış preg_match kullanıyorum?

$domain = '@djkal';
$regexp = '/^[a-zA-Z0-9][a-zA-Z0-9\-\_]+[a-zA-Z0-9]$/';
if (false === preg_match($regexp, $domain)) {
    throw new Exception('Domain invalid');
}

12 Cevap

/^[a-zA-Z0-9][a-zA-Z0-9\-\_]+[a-zA-Z0-9]$/

({[) 0 (]} olmadan) alan adı kısmını aynı olmalıdır.

<?php
function is_valid_domain_name($domain_name)
{
    return (preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $domain_name) //valid chars check
            && preg_match("/^.{1,253}$/", $domain_name) //overall length check
            && preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $domain_name)   ); //length of each label
}
?>

Test durumlarda:

is_valid_domain_name? [a]                       Y
is_valid_domain_name? [0]                       Y
is_valid_domain_name? [a.b]                     Y
is_valid_domain_name? [localhost]               Y
is_valid_domain_name? [google.com]              Y
is_valid_domain_name? [news.google.co.uk]       Y
is_valid_domain_name? [xn--fsqu00a.xn--0zwm56d] Y
is_valid_domain_name? [goo gle.com]             N
is_valid_domain_name? [google..com]             N
is_valid_domain_name? [google.com ]             N
is_valid_domain_name? [google-.com]             N
is_valid_domain_name? [.google.com]             N
is_valid_domain_name? [<script]                 N
is_valid_domain_name? [alert(]                  N
is_valid_domain_name? [.]                       N
is_valid_domain_name? [..]                      N
is_valid_domain_name? [ ]                       N
is_valid_domain_name? [-]                       N
is_valid_domain_name? []                        N

Size bu etki geçerli bir biçimi olup olmadığını kontrol, aynı zamanda etkin olup olmadığını / atanmış bir IP adresi var olacak değil.

$domain = "stackoverflow.com";

if(filter_var(gethostbyname($domain), FILTER_VALIDATE_IP))
{
    return TRUE;
}

Öncelikle, sen demek olmadığını açıklamak gerekir:

  1. tek etki alanı adı etiketler
  2. tüm alan adları (yani birden fazla nokta-ayrı etiketler)
  3. 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 - geçerlidir
  • 0 - geçerlidir
  • a- - geçersiz
  • a-b - geçerlidir
  • xn--dasdkhfsd - 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.

İşte regex olmadan başka bir yoludur.

$myUrl = "http://www.domain.com/link.php";
$myParsedURL = parse_url($myUrl);
$myDomainName= $myParsedURL['host'];
$ipAddress = gethostbyname($myDomainName);
if($ipAddress == $myDomainName)
{
   echo "There is no url";
}
else
{
   echo "url found";
}

Eğer etki alanı adı izole kez ben Erklan fikrini kullanarak, diyelim ki, düşünüyorum:

$myUrl = "http://www.domain.com/link.php";
$myParsedURL = parse_url($myUrl);
$myDomainName= $myParsedURL['host'];

Eğer kullanabilirsiniz:

if( false === filter_var( $myDomainName, FILTER_VALIDATE_URL ) ) {
// failed test

}

PHP5s Filtre fonksiyonları böyle bir amaç için ben sanırdım edilir.

O Regex kullanmak değildir gibi kesinlikle sorunuza cevap vermez, ben farkında.

Normal ifade, bir etki alanı doğrulaması için denetleme en etkili yoludur. Eğer ölü (IMO aptalca) bir Düzenli ifadeler kullanarak değil hazırsınız, o zaman bir etki her bölümünü bölünmüş olabilir:

  • www. / Sub-domain
  • alan adı
  • . Uzatma

Daha sonra geçerli bir etki eşleştiğini görmek için bir döngü çeşit her karakteri kontrol etmesi gerekir.

Sanki normal bir ifadeyi kullanmak çok daha etkili olduğunu söyledi.

Düzenli ifade gayet iyi, ama preg_match doğru kullanmıyorsunuz demektir. Bir int (0 veya 1), bir boolean döndürür. Sadece yazmak if(!preg_match($regex, $string)) { ... }

Eğer normal ifadeler kullanmak istemiyorsanız, bu deneyebilirsiniz:

$str = 'domain-name';

if (ctype_alnum(str_replace('-', '', $str)) && $str[0] != '-' && $str[strlen($str) - 1] != '-') {
	echo "Valid domain\n";
} else {
	echo "Invalid domain\n";
}

ama regexp bunun için en iyi araç olduğunu söyledi.

kullanmak checkdnsrr http://php.net/manual/en/function.checkdnsrr.php

$domain = "stackoverflow.com";

checkdnsrr($domain , "A");

//returns true if has a dns A record, false otherwise

This post explain how to validate check domain name is valid or not

  • Alan Adı Alpha Sayısal içermelidir
  • Sadece özel karakter (-) tire. alan adları izin verilir.
  • Jenerik domain uzantısı (. Com,. Edu,. Gov,. Int. Mil,. Net ve. Org) kontrol
  • Tüm Uluslararası domain uzantıları (TLD) ICANN tarafından onaylanmış

Php fonksiyonunu kontrol edin

checkdnsrr

enter code here

fonksiyonu validate_email ($ email) {

$ Exp = "^ [az '0 \ -9] + ([. _-] [Az \ '0 -9] +) * @ ([a-z0-9] + ([. _-] [A- z0-9] +)) + $ ";

if (eregi ($ exp, $ email)) {

  if(checkdnsrr(array_pop(explode("@",$email)),"MX")){
    return true;
  {} Else
    return false;
  }

{} Else

  return false;

}
}

Teşekkürler!