我需要从带有正则表达式
的链接中提取域或第一级子域www.google.com -> google.com
www.maps.google.com -> maps.google.com
www.dev.maps.google.com - > maps.google.com
www.dev.maps.google.com/show/maps - > maps.google.com
我知道如何提取域名,但是我很难写出一个表达式来检测是否存在子域并且只获取第一个域 有人能告诉我正确的表达吗?
答案 0 :(得分:0)
我无法想出一个你想要的正则表达式,但是因为这个问题只用php标记,所以这里有一些PHP代码可以做你想要的。
此代码将您的输入拆分为"。",从最后一部分提取tld并将所有内容从拆分字符串中移出3个元素,同时忽略可能的" www"部分。最后,它将结合最多3个剩余部分,为您提供所需的域,可能有一个子域。
<?php
$domain = 'www.dev.maps.google.com/asd/fgh';
$parts = explode('.', $domain);
// extract tld
preg_match('/([a-z]+)[^a-z]/', $parts[count($parts)-1], $tldMatches);
$parts[count($parts)-1] = (isset($tldMatches[1]))
? $tldMatches[1]
: $parts[count($parts)-1];
// remove www if present
if ('www' === $parts[0]) {
array_shift($parts);
}
// define how many parts we have to ignore
$splitHere = (count($parts) > 3)
? count($parts) - 3
: 0;
// output the desired parts combined with "."
echo implode('.', array_slice($parts, $splitHere)) . PHP_EOL;
此代码不适用于umlaut-domains。
答案 1 :(得分:0)
通常不建议使用基于正则表达式的方法来操作url字符串。第一项业务是为host
准备字符串,然后您将有一个坚实的基础开始。
生成标准化的explode()
字符串后,我使用$array=['google.com', // -> google.com
'www.google.com', // -> google.com
'www.maps.google.com', // -> maps.google.com
'www.dev.maps.google.com', // - > maps.google.com
'www.dev.maps.google.com/show/maps', // - > maps.google.com
'www.dev.maps.google.com?key=value', // - > maps.google.com
];
foreach($array as $url){
$host=parse_url("http://$url")['host']; // reliable way to isolate host component only
$bits=explode('.',$host); // split string on dots
if($bits[0]==='www'){ // check for www in first element
unset($bits[0]); // remove first element
}
echo implode('.',array_slice($bits,-3)),"\n"; // extract maximum of 3 elements from end, rejoin with dots
}
和数组函数来提取所需的结果。
代码:(Demo)
google.com
google.com
maps.google.com
maps.google.com
maps.google.com
maps.google.com
输出:
www.
此代码不是为了将输入字符串验证为有效网址而编写的。它假设您将为其提供有效域。如果您知道在dev.
之后移动的唯一子字符串将是 if ctry in countries:
countries[ ctry ] += 1
else:
countries[ ctry ] = 1
,那么可以更直接地编写方法。