2013-03-27 46 views
2

我想在PHP中構建一個驗證腳本,它將與我的網站提供的API一起使用。這個想法是,用戶將進入他們的API應該工作的所有領域,防止競爭對手將代碼放在他們的網站上。我只是想驗證所輸入的域名是有效的格式PHP - 使用wilcards和/或子域驗證域

以下域類型應該被允許的:

  • xyz.domain.xxxx
  • * .domain.xxxx
  • 域。 XXXX

我已搜索周圍,我發現的代碼片段(123)傾向於降低所有領域爲最簡單的表格,domain.com,似乎沒有考慮通配符或子域名 - 或似乎與我所尋找的有所不同。

我希望有一天能掌握Reg表達式。

在此先感謝!

UPDATE:解決方案

最後我用的是拒絕TLD的正則表達式 - 如果preg_match失敗,我再運行在域作爲一個安全網,將驗證TLD的一個DNS檢查。這可以防止人們進入垃圾一樣MyNameIsFred

$domain = str_replace('http://', '', strtolower($_REQUEST['domain'])); 

//Not checking TLDs. Instead if the domain fails, we will check DNS records to see if it is a TLD or somehow otherwise exists. 
/* $reg = '/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)([a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?)(?>\.(?1)){0,126}$/iD'; //TLD domains OK */ 

$reg = '/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?(?>\.[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?){1,126}$/iD'; //No TLD 
if (preg_match($reg, $domain)!=1) { 
    if (!checkdnsrr($domain.'.', 'A') && !checkdnsrr($domain.'.', 'AAAA')) 
     //ERROR 
}  
//SUCCESS 
+0

它不太你在找什麼,所以不回答這個問題,但它是值得了解:http://php.net/manual/en/filter.filters.validate.php – Spudley 2013-03-27 15:08:46

+0

你是正確的 - 不會真的有幫助,但很高興知道。謝謝 – Dutchie432 2013-03-27 16:55:04

回答

1

這應該驗證域(用通配符)

'/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)([a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?)(?>\.(?1)){1,126}$/iD' 

將允許TLD只域 (應要求刪除),或只是一個*

不允許連續* s。

如果上述不起作用,可能是因爲您使用的是舊版本的PHP(以及較舊版本的PCRE)。以下應該可以解決這個問題:

'/^(?!.{254,})(?!.*[^.]{64,})(?!.*\*\*)[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?(?>\.[a-z0-9*](?>[a-z0-9-*]*[a-z0-9*])?){1,126}$/iD' 
+0

謝謝,但我得到這個:'preg_match():編譯失敗:在(第5行偏移80處的?)之後無法識別的字符請參閱示例:http://codepad.org/alRevMYZ – Dutchie432 2013-03-27 14:15:04

+0

你使用的是什麼版本?我的編輯 – MichaelRushton 2013-03-27 14:16:04

+0

PHP版本5.4.8 – Dutchie432 2013-03-27 14:18:30

0

漂亮的直線前進而無需爲不同的部分多少測試,但是一般模式。

^([\w*]+\.)?([\w-]+)(\.\w+)$ 
+1

只允許'a.b.c'。那麼'www.del.icio.us'呢?此外,允許前後連字符,並且不會限制標籤或域的長度。 – MichaelRushton 2013-03-27 14:13:18

+0

就像我說的,沒有太多的測試,但直接覆蓋OP顯示的情況。 – Simon 2013-03-27 14:18:24