如何从URL获取域名

Chi*_*may 49 regex url

如何从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        |
+----------------------+------------+
Run Code Online (Sandbox Code Playgroud)

有关:

pi.*_*pi. 39

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

  • 获取可用的每个ccTLDgTLD的列表.您的第一站应该是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__)$
Run Code Online (Sandbox Code Playgroud)

这非常有效,并且还与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认同)

Mik*_*e K 17

聚会有点晚了,但是:

const urls = [
  'www.abc.au.uk',
  'https://github.com',
  'http://github.ca',
  'https://www.google.ru',
  'http://www.google.co.uk',
  'www.yandex.com',
  'yandex.ru',
  'yandex'
]

urls.forEach(url => console.log(url.replace(/.+\/\/|www.|\..+/g, '')))
Run Code Online (Sandbox Code Playgroud)

  • 这很好,接受的答案也没有,但这种方式是可扩展的并且更加动态。无论您需要专门匹配 10-20% 的情况,如果这种方法存在缺陷,您都可以按照已接受的答案进行硬编码。这是社区的答案,而不是 OP 的答案,OP 11 年前就已经收到了答案。 (3认同)
  • 这**不起作用**:对于输入“www.mail.yahoo.co.in”,所需的输出是“mail.yahoo”,但输出“mail” (2认同)

jfs*_*jfs 11

/^(?:www\.)?(.*?)\.(?:com|au\.uk|co\.in)$/
Run Code Online (Sandbox Code Playgroud)

  • +1 - 谈简洁 - 答案中没有英文.爱它. (9认同)

Cli*_*ton 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;
}
Run Code Online (Sandbox Code Playgroud)

这个简单的功能几乎适用于所有情况.有一些例外,但这些非常罕见.

要演示/测试此功能,您可以使用以下内容:

$urls = array('www.test.com', 'test.com', 'cp.test.com' .....);
echo "<div style='overflow-x:auto;'>";
echo "<table>";
echo "<tr><th>URL</th><th>Host</th><th>Domain</th><th>Domain X</th></tr>";
foreach ($urls as $url) {
    $info = parse_url_all($url);
    echo "<tr><td>".$url."</td><td>".$info['host'].
    "</td><td>".$info['domain']."</td><td>".$info['domainX']."</td></tr>";
}
echo "</table></div>";
Run Code Online (Sandbox Code Playgroud)

列出的URL的输出如下:

在此输入图像描述

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

我希望这个对你有用.


Fiz*_*han 8

有两种方式

使用拆分

然后只需解析该字符串

var domain;
//find & remove protocol (http, ftp, etc.) and get domain
if (url.indexOf('://') > -1) {
    domain = url.split('/')[2];
} if (url.indexOf('//') === 0) {
    domain = url.split('/')[2];
} else {
    domain = url.split('/')[0];
}

//find & remove port number
domain = domain.split(':')[0];
Run Code Online (Sandbox Code Playgroud)

使用正则表达式

 var r = /:\/\/(.[^/]+)/;
 "http://stackoverflow.com/questions/5343288/get-url".match(r)[1] 
 => stackoverflow.com
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助