2011-09-23 46 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