当前位置:  开发笔记 > 编程语言 > 正文

如何从URL获取域名

如何解决《如何从URL获取域名》经验,为你挑选了3个好方法。

如何从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 ""; } echo "
URLHostDomainDomain X
".$url."".$info['host']. "".$info['domain']."".$info['domainX']."
";

列出的URL的输出如下:

在此输入图像描述

如您所见,无论提供给函数的URL如何,都会始终提取不带扩展名的域名和域名.

我希望这个对你有用.



1> pi...:

我曾经为一家我工作过的公司写过这样的正则表达式.解决方案是这样的:

获取可用的每个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端点查询它.随意贡献!
RE:更新繁琐 - 编写一个小代码生成器程序,根据输入数据文件生成正则表达式.
Mozilla的列表实际上看起来非常好 - 它有*.uk来匹配.ac.uk.您只需要弄清楚格式并正确解释规则.
Mozilla PSL现在匹配`*.uk`,所以@ pi.关于它无法匹配`ac.uk`的担忧不再适用.

2> jfs..:
/^(?:www\.)?(.*?)\.(?:com|au\.uk|co\.in)$/


+1 - 谈简洁 - 答案中没有英文.爱它.

3> Clinton..:

准确地提取域名可能非常棘手,主要是因为域扩展可以包含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 ""; } echo "
URLHostDomainDomain X
".$url."".$info['host']. "".$info['domain']."".$info['domainX']."
";

列出的URL的输出如下:

在此输入图像描述

如您所见,无论提供给函数的URL如何,都会始终提取不带扩展名的域名和域名.

我希望这个对你有用.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有