2011-08-12 47 views
0

我想提取一個名稱服務器。 $output的格式是這樣的,例如它包含ns1.nameserver.com。可能還包含www.apple.com
這當然不是名稱服務器。PHP正則表達式不以......負面lookbehind不起作用?

我想不包含,因此包含任何結果www.
我嘗試以下:

$regexp = "/(?<!www)([A-Za-z0-9-]+[\.][A-Za-z0-9-]+[\.][A-Za-z0-9-\.]+)/i"; 
preg_match_all($regexp, $output, $nameservers); 
+1

「這當然不是一個域名服務器。」你不能確定 - 沒有任何人阻止任何人使用www.whatever.com作爲他們的名字服務器名稱。 –

+0

這聽起來像是你正試圖將shell exec的文本輸出解析爲whois。如果您已經知道起始域名,那麼您最好做一個明確的NS查詢。您可以使用PEAR的Net_DNS模塊或shell exec來進行挖掘。 (例如,「挖+短google.com NS」) –

回答

3

你需要向前看,而不是回顧後:

/(?!www)([A-Za-z0-9-]+[\.][A-Za-z0-9-]+[\.][A-Za-z0-9-\.]+)/i 

然而,這可能不是因爲它會繼續匹配字符串www.abc.def.com中的abc.def.com。你想也需要一些錨和回顧後(並且你不需要一些括號,反斜槓也不i修改):

/(?<!\.)(?!www)\b([A-Za-z0-9-]+\.[A-Za-z0-9-]+\.[A-Za-z0-9.-]+)/ 
+0

你的榜樣完美的作品......現在我想圍繞我的頭,爲什麼:) 我是正確至件事(?<!\)。檢查沒有程序「。」 (?!WWW)檢查沒有想出一個WWW .. 至於\乙字邊界..你能在它的使用可能細說了? –

+0

你是對的。至於'\ b',它確保我們在單詞的開頭開始我們的匹配。例如,如果沒有它,我們會在'www2.amazon.com'中匹配'ww2.amazon.com'。 –

+0

這是否意味着如果輸出是「名稱服務器:www.amazon.com」I.E兩個詞之間沒有空格就會搞砸了?謝謝 –