2011-09-12 65 views
1

我將不勝感激任何可以與此事有關的幫助。PHP - 允許域名,而不是子域名

我正在創建一個註冊表單,其中一個字段是用於用戶域的,我將驗證其與FILTER_VALIDATE_URL的有效性並且它存在於dns_check_record

但是我有一個問題是,使用這兩種方法也將允許子域提交到我不想形式。

有誰知道一種方法來允許域名,但不是子域名?

我已經測試了以下功能,從http://syntax.cwarn23.net/PHP/Strip_URL_to_Domain

function domain($domainb) 
{ 
$bits = explode('/', $domainb); 
if ($bits[0]=='http:' || $bits[0]=='https:') 
    { 
    $domainb= $bits[2]; 
    } else { 
    $domainb= $bits[0]; 
    } 
unset($bits); 
$bits = explode('.', $domainb); 
$idz=count($bits); 
$idz-=3; 
if (strlen($bits[($idz+2)])==2) { 
$url=$bits[$idz].'.'.$bits[($idz+1)].'.'.$bits[($idz+2)]; 
} else if (strlen($bits[($idz+2)])==0) { 
$url=$bits[($idz)].'.'.$bits[($idz+1)]; 
} else { 
$url=$bits[($idz+1)].'.'.$bits[($idz+2)]; 
} 
return $url; 

然而,這並不是完美的,因爲任何領域,如www.domain.uk.com將顯示爲uk.com(我不知道一個普通的域擴展)。

有沒有人知道比上述功能更好的方法?

+3

您必須明確檢查諸如'.co.uk','.com.br'等內容。 –

+0

您使用* subdomain *這個詞相當鬆散。你想拒絕地址,如「john @ customers.example.com」? –

+0

對不起,我的意思是想阻止任何這樣的事情。 – James

回答

0

正如指出的邁克爾Mior,你必須檢查.co.uk.com.br和其他許多人。

一些瀏覽器廠商都保持這樣的非頂級域名是有效TLD的列表:http://publicsuffix.org/。該列表是quite huge

有一個庫here使用這個有效的頂級域名列表來實現你正在尋找的功能(下載是here)。 (通過https://wiki.mozilla.org/Gecko:Effective_TLD_Service實測值。)

+0

......巨大且不斷變化。恕我直言,它看起來像浪費時間。 –

+0

是的,看起來這個列表非常龐大,看起來我只需要手動批准每個域。不過謝謝你的幫助。 – James

0

合併它們。

dns_check_record將在'.co.uk'上失敗,所以你可以將你的字符串拆分成點,檢查當你合併最後兩部分時得到的域名,如果失敗了,也可以使用第三部分if任何。

你會做無效域的仔細檢查,但我認爲這不會是一個問題。

+0

非常感謝你,我不知道它會因.co.uk而失敗。 – James

0

首先,你可以使用parse_url()只得到主機名:http://www.stackoverflow.com - > $網址[「主機」] =「www.stackoverflow.com」

其次,你可以指望在主機名點的量:爆炸() - >計數()或substr_count()

有主機1點多的子域可被存在。

現在你可以使用由GolezTrol或arnaud576875提到的解決方案。

+0

感謝您的幫助,這是獲取主機名比我使用的更好的方法,我會記下這個功能。 – James

+0

但是,如果它只包含一個點,則仍可能具有無效的網址。如果只輸入'co.uk',請注意不要將其作爲有效域名。所以,實際上,不需要多少點的細節,你總是要檢查它是否是一個有效的域。 – GolezTrol