我有一些域名要分割,但无法弄清楚正则表达式...
我有:
http://www.google.com/tomato
http://int.google.com
http://google.co.uk
鉴于其中任何一项,我只想提取google
。有什么想法吗?
答案 0 :(得分:3)
为什么要尝试使用正则表达式?有很多本机功能可供您使用,例如:
$host = parse_url($url, PHP_URL_HOST);
更新,给它一个去,它可能需要改进,但它比Regex imo
更好function determainDomainName($url)
{
$hostname = parse_url($url, PHP_URL_HOST);
$parts = explode(".",$hostname);
switch(count($parts))
{
case 1:
return $parts[0]; //has to be a .com etc
break;
case 2:
if($parts[1] == "www") //The most common subdomain
{
return $parts[2]; //Bypass Subdomain / return next segment
}
if($parts[2] == "co") //Possible in_array here for multiples, but first segment of double barrel tld
{
return $parts[1]; //Bypass double barrel tld's
}
break;
default:
//Have a guess
//I bet the longest word is the domain :)
usort($parts,"mysort");
return $parts[0];
/*
here we just order the array by the longest word
so google will always come above the following
com,co,uk,www,cdn,ww1,ww2 etc
*/
break;
}
}
function mysort($a,$b){
return strlen($b) - strlen($a);
}
将以下2个功能添加到您的库等。
然后像这样使用:
$urls = array(
'http://www.google.com/tomato',
'http://int.google.com',
'http://google.co.uk'
);
foreach($urls as $url)
{
echo determainDomainName($url) . "\n";
}
他们都会回复google
答案 1 :(得分:0)
这里的答案可能就是你要找的东西。
答案 2 :(得分:0)
$res = preg_replace( "/^(http:\/\/)([a-z_\-]+\.)*([a-z_\-]+)\.(com|co.uk|net)\/.*$/im", "\$3", $in );
添加尽可能多的结局
编辑:犯了一个错误: - (
答案 3 :(得分:0)
您可以在最佳投注基础上执行此操作。 URL的最后一部分始终是TLD(和可选的根)。你基本上在寻找超过2个字母的任何前面的单词:
$url = "http://www.google.co.uk./search?q=..";
preg_match("#http://
(?:[^/]+\.)* # cut off any preceeding www*
([\w-]{3,}) # main domain name
(\.\w\w)? # two-letter second level domain .co
\.\w+\.? # TLD
(/|:|$) # end regex with / or : or string end
#x",
$url, $match);
如果您期望更长的二级域名(.com可能?),请添加另一个\w
。但这不是很通用,如果允许,你实际上需要一个TLD列表。