Preg_replace域名问题

时间:2011-09-23 16:51:43

标签: php regex

我试图使用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 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

为什么要使用正则表达式?当然有可能,但使用这个:

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

会做得很好;

答案 2 :(得分:0)

以下代码假定每个条目都恰好位于字符串的开头:

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

// var_dump($m[2]);

P.S。但正确的答案仍然是parse_url

答案 3 :(得分: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