我试图使用preg_replace来获取域名,
我有一些列表网址
download.adwarebot.com/setup.exe
athena.vistapages.com/suspended.page /
prosearchs.com/se/tds/in.cgi?4&group=5¶meter=mail
freeserials.spb.ru/key/68703.htm
我想要的是
adwarebot.com
vistapages.com
prosearchs.com
spb.ru
任何机构都可以帮我preg_replace
?
我正在使用此http://gskinner.com/RegExr/进行测试:)
答案 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¶meter=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¶meter=mail
dquote> freeserials.spb.ru/key/68703.htm"|grep -Po '(?<!/)([^\./]+\.[^\./]+)(?=/.+)'
输出:
adwarebot.com
vistapages.com
prosearchs.com
spb.ru