如何从URL字符串中获取域名?
+----------------------+------------+ | input | output | +----------------------+------------+ | www.google.com | google | | www.mail.yahoo.com | mail.yahoo | | www.mail.yahoo.co.in | mail.yahoo | | www.abc.au.uk | abc | +----------------------+------------+
有关:
通过正则表达式匹配网址
pi... 39
我曾经为一家我工作过的公司写过这样的正则表达式.解决方案是这样的:
获取可用的每个ccTLD和gTLD的列表.您的第一站应该是IANA.Mozilla的列表一见钟情,但缺少ac.uk,所以为此它并不真正可用.
加入列表,如下例所示.警告:订购很重要!如果org.uk出现在英国之后,那么example.org.uk将匹配org而不是示例.
示例正则表达式:
.*([^\.]+)(com|net|org|info|coop|int|co\.uk|org\.uk|ac\.uk|uk|__and so on__)$
这非常有效,并且还与de.com和朋友等奇怪的,非官方的顶层相匹配.
好处:
如果正则表达式是最优化的,那么速度非常快
这个解决方案的缺点当然是:
手写正则表达式,如果ccTLD发生变化或被添加,必须手动更新.繁琐的工作!
非常大的正则表达式,所以不太可读.
我需要这个用于几个项目,所以我用Python实现它并[在GitHub上打开它](http://github.com/john-kurkowski/tldextract).您还可以通过App Engine上的HTTP端点查询它.随意贡献! (14认同)
RE:更新繁琐 - 编写一个小代码生成器程序,根据输入数据文件生成正则表达式. (4认同)
Mozilla的列表实际上看起来非常好 - 它有*.uk来匹配.ac.uk.您只需要弄清楚格式并正确解释规则. (2认同)
Mozilla PSL现在匹配`*.uk`,所以@ pi.关于它无法匹配`ac.uk`的担忧不再适用. (2认同)
jfs.. 11
/^(?:www\.)?(.*?)\.(?:com|au\.uk|co\.in)$/
+1 - 谈简洁 - 答案中没有英文.爱它. (9认同)
Clinton.. 11
准确地提取域名可能非常棘手,主要是因为域扩展可以包含2个部分(如.com.au或.co.uk),并且子域(前缀)可能存在也可能不存在.列出所有域扩展名不是一个选项,因为有数百个.例如,EuroDNS.com列出了800多个域名扩展名.
因此,我写了一个简短的php函数,它使用'parse_url()'和一些关于域扩展的观察来准确地提取url组件和域名.功能如下:
function parse_url_all($url){ $url = substr($url,0,4)=='http'? $url: 'http://'.$url; $d = parse_url($url); $tmp = explode('.',$d['host']); $n = count($tmp); if ($n>=2){ if ($n==4 || ($n==3 && strlen($tmp[($n-2)])<=3)){ $d['domain'] = $tmp[($n-3)].".".$tmp[($n-2)].".".$tmp[($n-1)]; $d['domainX'] = $tmp[($n-3)]; } else { $d['domain'] = $tmp[($n-2)].".".$tmp[($n-1)]; $d['domainX'] = $tmp[($n-2)]; } } return $d; }
这个简单的功能几乎适用于所有情况.有一些例外,但这些非常罕见.
要演示/测试此功能,您可以使用以下内容:
$urls = array('www.test.com', 'test.com', 'cp.test.com' .....); echo ""; echo "";"; echo "
"; foreach ($urls as $url) { $info = parse_url_all($url); echo " URL Host Domain Domain X "; } echo " ".$url." ".$info['host']. " ".$info['domain']." ".$info['domainX']."
列出的URL的输出如下:
如您所见,无论提供给函数的URL如何,都会始终提取不带扩展名的域名和域名.
我希望这个对你有用.
我曾经为一家我工作过的公司写过这样的正则表达式.解决方案是这样的:
获取可用的每个ccTLD和gTLD的列表.您的第一站应该是IANA.Mozilla的列表一见钟情,但缺少ac.uk,所以为此它并不真正可用.
加入列表,如下例所示.警告:订购很重要!如果org.uk出现在英国之后,那么example.org.uk将匹配org而不是示例.
示例正则表达式:
.*([^\.]+)(com|net|org|info|coop|int|co\.uk|org\.uk|ac\.uk|uk|__and so on__)$
这非常有效,并且还与de.com和朋友等奇怪的,非官方的顶层相匹配.
好处:
如果正则表达式是最优化的,那么速度非常快
这个解决方案的缺点当然是:
手写正则表达式,如果ccTLD发生变化或被添加,必须手动更新.繁琐的工作!
非常大的正则表达式,所以不太可读.
/^(?:www\.)?(.*?)\.(?:com|au\.uk|co\.in)$/
准确地提取域名可能非常棘手,主要是因为域扩展可以包含2个部分(如.com.au或.co.uk),并且子域(前缀)可能存在也可能不存在.列出所有域扩展名不是一个选项,因为有数百个.例如,EuroDNS.com列出了800多个域名扩展名.
因此,我写了一个简短的php函数,它使用'parse_url()'和一些关于域扩展的观察来准确地提取url组件和域名.功能如下:
function parse_url_all($url){ $url = substr($url,0,4)=='http'? $url: 'http://'.$url; $d = parse_url($url); $tmp = explode('.',$d['host']); $n = count($tmp); if ($n>=2){ if ($n==4 || ($n==3 && strlen($tmp[($n-2)])<=3)){ $d['domain'] = $tmp[($n-3)].".".$tmp[($n-2)].".".$tmp[($n-1)]; $d['domainX'] = $tmp[($n-3)]; } else { $d['domain'] = $tmp[($n-2)].".".$tmp[($n-1)]; $d['domainX'] = $tmp[($n-2)]; } } return $d; }
这个简单的功能几乎适用于所有情况.有一些例外,但这些非常罕见.
要演示/测试此功能,您可以使用以下内容:
$urls = array('www.test.com', 'test.com', 'cp.test.com' .....); echo ""; echo "";"; echo "
"; foreach ($urls as $url) { $info = parse_url_all($url); echo " URL Host Domain Domain X "; } echo " ".$url." ".$info['host']. " ".$info['domain']." ".$info['domainX']."
列出的URL的输出如下:
如您所见,无论提供给函数的URL如何,都会始终提取不带扩展名的域名和域名.
我希望这个对你有用.