1987WEB视界-分享互联网热点话题和事件

您现在的位置是:首页 > 域名 > 正文

域名

如何使用正则表达式得到一个URL中的主域名,不用正则还有什么方法?

1987web2022-09-20域名242
用正则表达式精准抽取「主域名」是做不到的。

用正则表达式精准抽取「主域名」是做不到的。

举个例子,给你

http://www.sina.com.cn

这样的 URL,你觉得主域名是什么呢?是http://sina.com.cn还是http://com.cn呢?

从常识来说,我们所希望得到的主域名,应该是能够清晰区分网站主体的域名后缀,比如上面的例子,就是http://sina.com.cn。那域名中的哪段内容才能区分网站主体呢?想一下就可以得出,是把整个域名从右往左分段,找到第一个「非公用」的部分。

首先,域名从右往左第一段是顶级域名(TLD),其中又分为通用顶级域名(gTLDs,如 .com、.edu、.org 等)和国家地区代码顶级域名(ccTLDs,如 .cn、.uk、.hk 等)。ICANN 统一管理 gTLDs,并将 ccTLDs 下放给各种域名注册机构管理,例如国家地区顶级域名就交由不同国家地区来管理。中国大陆的域名管理机构为著名的 CNNIC。我们再以 .cn 域名为例,下设一些预定义的「类别域名」如 .http://com.cn、.http://org.cn、.http://edu.cn以及「行政区域名」如 .http://sh.cn、.http://bj.cn,并且同时开放 .cn 域名的注册。这意味着,我注册一个叫 test 的域名,既可以是http://test.com.cn也可以是http://test.cn,也就是说,那些域名的「公用部分」长度是不确定的。那么如果给我一个 URL 我是没法以一个固定的方式来做截取的,而是必须知道这个 URL 的域名中哪个最长的后缀已经被某个域名管理机构预定义为公用的域名,然后剔除掉这部分才能找到第一个非公用的部分。

幸好,有

Public Suffix List

这样的项目,你可以利用它提供的列表,来提取需要的「主域名」。目前的数据见:

http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1

。另外,你可以看看这个列表:

Learn more about the Public Suffix List

,看看都有谁在使用和维护这份数据,以及他们都用来干嘛,比如:

  • Firefox 用来做浏览器地址栏的反钓鱼(高亮显示正确的「主域名」)
  • Firefox 和 Chrome 都用其来进行 Cookie 相关的域名检测
  • Chrome 用来判断用户在地址栏输入的是否是一个域名

从这个页面你也可以看到,你用 JavaScript 的话,可以直接使用

tld.js

这个项目来提取主域名。