2012-11-30 71 views
1

我試圖檢查或驗證使用正則表達式的子域/域,檢查這就是我想要的:正則表達式規則,以檢查是否有子域

if($_SERVER['HTTP_ORIGIN'] == "^(.*\.?domain\.com)$"){ 
    header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']); 
} 

所以,如果子域是:es.domain。 com,en.domain.com,etc.domain.com,domain.ws,test.com,然後我可以打印標題政策。

更多說明:我有幾個子域(約40個)和兩個域(共3個域),我需要知道$ _SERVER ['HTTP_ORIGIN']是否等於這個域或子域之一,如果是然後我打印標題策略。

我想用正則表達式來做這件事,因爲如果我把子域/域放在列表中,這將會太長。任何幫助?

簡歷:我有三個域:domain.com,domain.ws和test.com(每個子域都有),我希望通過此驗證。

回答

1

那麼,PHP有preg_*函數用於正則表達式。你的情況:

if(preg_match('/^(?:.+\.)?domain\.com$/', $_SERVER['HTTP_ORIGIN'])) 

如果您想更具體的瞭解所允許的域和子域(允許任意組合 - 我假設的二級域名是別名):

if(preg_match('/^(?:(?:es|en|etc)\.)?(?:domain\.com|domain\.ws|test\.com)$/', $_SERVER['HTTP_ORIGIN'])) 

會允許任何您提到的主機名稱。

或者,您可以允許任何子域和域,capture them,然後檢查它們。假設您有一個允許的子域數組和允許的二級域數組。

preg_match('/^(?:(.+)\.)?([^.]+\.[^.]+)$/', $_SERVER['HTTP_ORIGIN'], $matches); 
$subdomain = $matches[1]; 
$domain = $matches[2]; 
if((!$subdomain || in_array($subdomain, $subdomainArray)) && 
    in_array($domain, $domainArray)) 
{ 
    ... 
} 

preg_match documentation.

+0

感謝m.buettner您的答覆。第一個代碼可以幫助我,但僅限於一個域(domain.com)。我提出的其他問題並不是我需要的,也許我做了一個錯誤的理解,唯一的區別是數字。另外兩個域名(除了「domain.com」)看起來更像:「domain.ws」(和「子域名」)和「.test.com」(和「子域名」)。我將編輯我的問題。 – Saymon

+0

@Saymon做我的編輯幫助? –

+0

不是真的,因爲我有太多的子域不僅僅是es | en | etc,如果我創建另一個子域,那麼我也必須編輯這個規則。第一個是完美的,但只適用於一個領域,有沒有辦法做類似的事情,但對於三個領域? – Saymon

0

試試這個

preg_match("/".addcslashes($_SERVER["DOCUMENT_ROOT"],"/")."\/(\w+)\//",$_SERVER["SCRIPT_FILENAME"],$d); 

$sub = $d[1];