2011-09-23 67 views
0

我堅持嘗試使用了preg_replace得到域,的preg_replace域問題

我有一些名單網址

  • download.adwarebot.com/setup.exe

  • athena.vistapages .com/suspended.page/

  • prosearchs.com/se/tds/in.cgi?4 & group = 5 & parameter = mail

  • freeserials.spb.ru/key/68703.htm

我想是

  • adwarebot.com

  • vistapages.com

  • prosearchs.com

  • spb.ru

任何機構可以幫助我preg_replace

我使用這個http://gskinner.com/RegExr/測試:)

+4

我敢肯定有更沒有正則表達式的優雅解決方案['parse_url'](http://php.net/parse_url) – knittl

+0

http://www.rubular.com/r/21AiYeBsvb - 第二次捕獲(將使用'preg_match'而不是'preg_replace') – mellamokb

+2

這將是對於沒有預期TLD列表的'雙管'頂級域名(例如'.ac.uk'),腳本很難確定什麼是和不是子域。 knittl的答案通過將TLD列在正則表達式中來彌補這一點。 – connec

回答

0

爲什麼要使用正則表達式?當然這是可能的,但使用這個:

foreach($url in $url_list){ 
    $url_parts = explode('/', $url); 
    $domains[] = preg_replace('~(^[^\.]+\.)~i','',$url_parts[0]); 
} 
$domains = array_unique($domains); 

會做得很好;使用

+0

需要對子域進行特殊處理(OP要將它們剝離) – knittl

1

preg_replace函數,如果TLD的數量是有限的:

$urls = array('download.adwarebot.com/setup.exe', 
    'athena.vistapages.com/suspended.page/', 
    'prosearchs.com/se/tds/in.cgi?4&group=5&parameter=mail', 
    'freeserials.spb.ru/key/68703.htm'); 
$domains = preg_replace('|([^.]*\.(?:com|ru))/', '$1', $urls); 

匹配.com.ru這不是一個時間段之前出現的一切。 (不匹配的子域)


但是你可以使用PHP的內置parse_url功能獲取主機(包括子域) - 使用另一個正則表達式,substr或數組操作,以擺脫它:

$host = parse_url('http://download.adwarebot.com/setup.exe', PHP_URL_HOST); 
if(count($parts = explode('.', $host)) > 2) 
    $host = implode('.', array_slice($parts, -2)); 
+0

+1 for parse_url – tttony

0

以下代碼假定每個條目都恰好在字符串的開頭:

preg_match_all('@^([\w]*\.)?([\w]*\.[\w]*)/@', $list, $m); 

// var_dump($m[2]); 

PS但正確的答案仍然是parse_url

0

也許更通用的解決方案:

通過grep的測試,我沒有PHP環境,不好意思:

kent$ echo "download.adwarebot.com/setup.exe 
dquote> athena.vistapages.com/suspended.page/ 
dquote> prosearchs.com/se/tds/in.cgi?4&group=5&parameter=mail 
dquote> freeserials.spb.ru/key/68703.htm"|grep -Po '(?<!/)([^\./]+\.[^\./]+)(?=/.+)' 

輸出:

adwarebot.com 
vistapages.com 
prosearchs.com 
spb.ru